简体   繁体   English

Python 脚本检查特定 Linux 命令是否仍在运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM