【问题标题】:Run multiple shell scripts from one and do something at each finish从一个运行多个 shell 脚本并在每次完成时执行一些操作
【发布时间】:2020-06-11 06:19:32
【问题描述】:

我正在尝试编写一个 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 对象的状态?

附:守护进程应该能够与多达 500 个进程一起工作(运行和跟踪状态)

【问题讨论】:

  • 谢谢,但我的工作人员是用另一种语言编写的,看来我至少必须将它们作为 shell 命令运行。还是 Pool 提供这样的选择?
  • 而且我还需要动态更改进程计数,对于一种类型的工人,最多 100 个。看起来像游泳池,我不能动态改变它的长度
  • “控制进程状态”是什么意思?你的意思是“检查进程是否还在运行”?
  • 是的,检查进程是否仍在运行或完成。

标签: python python-3.x subprocess daemon


【解决方案1】:

要检查子进程是否已终止,可以使用Popen 类的poll() 函数。如果它返回None 以外的内容,则子进程已终止。在您的 while 1 循环和一秒钟的睡眠中,您可以遍历进程字典和 poll 每个并决定当一个进程终止时该怎么做。

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

【讨论】:

    【解决方案2】:

    要等待使用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)

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2021-05-22
      • 1970-01-01
      • 2012-09-16
      • 2020-10-08
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多