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

问题描述 投票:0回答:1

我想写一个python的 守护进程它将运行 多脚本 就在 同期 在某些情况下,并在某些方面有所作为 各项工作结束

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)

如何控制proc的状态,并在进程结束时做一些事情,我想我需要一些类似于承诺的东西,或者检查每个我的字典proc对象的状态?

P.S.Daemon应该可以在500个进程中工作(运行和跟踪状态)。

python python-3.x subprocess daemon
1个回答
1
投票

要检查一个子进程是否已经终止,你可以使用 poll() 的作用 Popen 类。 如果它返回的不是 None,孩子的进程已经终止。 在你的 while 1 循环,再加上一秒钟的睡眠时间,你可以在进程字典中运行,然后 poll 每一个,并决定当一个终止时该怎么做。

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


0
投票

要等待一个用 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 以检查进程的状态,而无需等待其完成。(文件)

© www.soinside.com 2019 - 2024. All rights reserved.