运行 多个 shell 个脚本,并在每次完成时做一些事情

Run multiple shell scripts from one and do something at each finish

我正在尝试编写一个 python 守护进程 在某些情况下,运行 多个 shell 脚本 同时 并在每个任务完成

时做点什么
import time
import schedule
import subprocess


def spawn(name, count):
    cmd = 'some long lived shell process'
    proc = subprocess.Popen(cmd, shell=True, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL, close_fds=True)
    consumers_dictionary[name] = proc


def thread_task():
    if someconditions
        spawn(name, count)


consumers_dictionary = {}
schedule.every(1).seconds.do(thread_task)
while 1:
    schedule.run_pending()
    time.sleep(1)

如何控制进程状态并在进程完成时做一些事情? 认为我需要像 promises 这样的东西,或者检查我的每个字典 proc 对象的状态?

P.S。守护进程应该能够与最多 500 个进程一起工作(运行 并跟踪状态)

要等待使用 popen 打开的进程,请使用 wait。这是基于您的框架的代码示例:

def spawn(name, count):

    processes = [] 
    cmd = 'ls -l ; sleep 2'
    for _ in range(count):
        proc = subprocess.Popen(cmd, shell=True, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL, close_fds=True)
        processes.append(proc)

    for proc in processes:
        res = proc.wait()
        print(f"process with pid {proc.pid} returned {res}")


def thread_task():
    if True:
        spawn(name = "dummy", count = 5)

schedule.every(1).seconds.do(thread_task)

while 1:
    schedule.run_pending()
    time.sleep(1)

结果如下:

process with pid 7784 returned 0
process with pid 7801 returned 0
process with pid 7802 returned 0
process with pid 7803 returned 0
process with pid 7805 returned 0
process with pid 7807 returned 0
...

请注意,您还可以使用 poll 来检查进程的状态,而无需等待它完成。 (documentation)

要检查子进程是否已终止,可以使用Popen class 的poll() 函数。如果它 returns 不是 None,则子进程已终止。在具有一秒睡眠的 while 1 循环中,您可以 运行 通过进程字典和 poll 每个进程并决定当一个进程终止时要做什么。

从你写问题的方式来看,我猜这就是你想要的。如果您想在子进程终止时获得某种中断,看起来这是可能的,但可能取决于平台。