[英]Python script checking if a particular Linux command is still running
I want to write a Python script which will check every minute if some pre-defined process is still running on Linux machine and if it doesn't print a timestamp at what time it has crashed.我想编写一个 Python 脚本,它将每分钟检查一些预定义的进程是否仍在 Linux 机器上运行,以及它是否在崩溃的时间不打印时间戳。 I have written a script which is doing exactly that but unfortunately, it works correctly with only one process.我写了一个脚本,它正是这样做的,但不幸的是,它只在一个进程中正常工作。
This is my code:这是我的代码:
import subprocess
import shlex
import time
from datetime import datetime
proc_def = "top"
grep_cmd = "pgrep -a " + proc_def
try:
proc_run = subprocess.check_output(shlex.split(grep_cmd)).decode('utf-8')
proc_run = proc_run.strip().split('\n')
'''
Creating a dictionary with key the PID of the process and value
the command line
'''
proc_dict = dict(zip([i.split(' ', 1)[0] for i in proc_run],
[i.split(' ', 1)[1] for i in proc_run]))
check_run = "ps -o pid= -p "
for key, value in proc_dict.items():
check_run_cmd = check_run + key
try:
# While the output of check_run_cmd isn't empty line do
while subprocess.check_output(
shlex.split(check_run_cmd)
).decode('utf-8').strip():
# This print statement is for debugging purposes only
print("Running")
time.sleep(3)
'''
If the check_run_cmd is returning an error, it shows us the time
and date of the crash as well as the PID and the command line
'''
except subprocess.CalledProcessError as e:
print(f"PID: {key} of command: \"{value}\" stopped
at {datetime.now().strftime('%d-%m-%Y %T')}")
exit(1)
# Check if the proc_def is actually running on the machine
except subprocess.CalledProcessError as e:
print(f"The \"{proc_def}\" command isn't running on this machine")
For example, if there are two top
processes it will show me information about the crash time of only one of these processes and it will exit.例如,如果有两个top
进程,它将仅显示有关这些进程之一的崩溃时间的信息,然后它将退出。 I want to stay active as long as there is another process running and exit only if both processes are killed.只要有另一个进程在运行,我就想保持活动状态,并且仅当两个进程都被杀死时才退出。 It should present information when each of the processes has crashed.当每个进程崩溃时,它应该显示信息。
It shall also not be limited to two proc only and support multiple processes started with the same proc_def
command.它也不应仅限于两个 proc,并支持使用同一proc_def
命令启动的多个进程。
Have to change the logic a bit, but basically you want an infinite loop alternating a check on all processes - not checking the same one over and over:必须稍微改变逻辑,但基本上你想要一个无限循环来交替检查所有进程——而不是一遍又一遍地检查相同的进程:
import subprocess
import shlex
import time
from datetime import datetime
proc_def = "top"
grep_cmd = "pgrep -a " + proc_def
try:
proc_run = subprocess.check_output(shlex.split(grep_cmd)).decode('utf-8')
proc_run = proc_run.strip().split('\n')
'''
Creating a dictionary with key the PID of the process and value
the command line
'''
proc_dict = dict(zip([i.split(' ', 1)[0] for i in proc_run],
[i.split(' ', 1)[1] for i in proc_run]))
check_run = "ps -o pid= -p "
while proc_dict:
for key, value in proc_dict.items():
check_run_cmd = check_run + key
try:
# While the output of check_run_cmd isn't empty line do
subprocess.check_output(shlex.split(check_run_cmd)).decode('utf-8').strip()
# This print statement is for debugging purposes only
print("Running")
time.sleep(3)
except subprocess.CalledProcessError as e:
print(f"PID: {key} of command: \"{value}\" stopped at {datetime.now().strftime('%d-%m-%Y %T')}")
del proc_dict[key]
break
# Check if the proc_def is actually running on the machine
except subprocess.CalledProcessError as e:
print(f"The \"{proc_def}\" command isn't running on this machine")
This suffers from the same problems in the original code, namely the time resolution is 3 seconds, and if a new process is run during this script, you won't ping it (though this may be desired).这在原始代码中遇到了同样的问题,即时间分辨率为 3 秒,如果在此脚本期间运行新进程,您将无法 ping 它(尽管这可能是需要的)。
The first problem would be fixed by sleeping for less time, depending on what you need, the second by running the initial lines creating proc_dict
in the while True
.第一个问题可以通过减少睡眠时间来解决,具体取决于您的需要,第二个问题是通过在while True
运行创建proc_dict
的初始行来proc_dict
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.