子进程:在后台启动进程并在一次调用中启动另一个进程

汉莎塑料

这个程序应该立即回显 sleep 的 pid:

import subprocess
subprocess.check_output("sleep 1 & echo $!", shell=True)

直接在 shell 上运行它,它立即打印 pid,但在 python 中运行它,它&被忽略并且在echo执行之前需要 1 秒

我怎样才能让它只在一次执行check_output(或另一个函数subprocess)时起作用

(这是一个简化的例子,实际上sleep 1我没有放置自己的可执行文件)

德莱尼

check_output等待输出管道关闭并sleep拥有它们。您可以重定向到/dev/null立即返回。

subprocess.check_output("sleep 1 >/dev/null 2>&1 & echo $!", shell=True)

更新

很难判断是否sleep 1真的在后台运行,所以我写了一个稍微大一点的测试。

test.py - 写入时间stdout为 5 秒

import time

for i in range(5):
    print(time.strftime('%H:%M:%S'), flush=True)
    time.sleep(1)
print('done', flush=True)

runner.py - 运行重定向stdout到文件的测试并监控文件。

import subprocess as subp
import time
import os

# run program in background
pid = int(subp.check_output("python3 test.py >test.out 2>&1 & echo $!",
    shell=True))
print("pid", pid)

# monitor output file
pos = 0
done = False
while not done:
    time.sleep(.1)
    if os.stat('test.out').st_size > pos:
        with open('test.out', 'rb') as fp:
            fp.seek(pos)
            for line in fp.readlines():
                print(line.strip().decode())
                done = b'done' in line
            pos = fp.tell()
print("test complete")

运行它,我明白了

td@mintyfresh ~/tmp $ python3 runner.py
pid 24353
09:32:18
09:32:19
09:32:20
09:32:21
09:32:22
done
test complete

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

杀死通过子进程在后台启动的SimpleHTTPServer进程

在后台启动linux进程

从另一个进程重新启动一个进程

C ++启动另一个进程的最佳方法?

如何在后台启动另一个应用程序?

无法让 python subprocess.Popen() 在后台启动另一个 python 脚本

通过使用子进程(Python)启动py.exe的另一个实例

进程在后台启动之前被杀死

鱼壳如何在后台启动进程的PID

在后台启动进程,执行任务,然后在后台终止进程

以另一个用户/组的身份启动进程(在init.d脚本中)

多人纸牌游戏-启动子进程或在一个进程中处理

如何在后台启动子进程并通过按键将其停止?

从一个终端从另一个终端启动进程

如何不杀死另一个进程在python中打开的子进程?

Windows cmd .bat-启动一个子进程,该进程同时运行到父进程,并在父进程关闭时关闭

在后台启动脚本时,我会运行两个进程

如何在另一个可可应用程序中嵌入一个可可应用程序并将其作为子进程启动

显示后台启动的进程的shell脚本

使进程一次在python中输出一个

等待一个进程完全启动

如何在一个进程被批处理文件启动的另一个进程启动后运行命令?

使用可用的System.console启动另一个进程

使用不同版本启动另一个节点子进程

从python运行.sh脚本以启动另一个进程

Linux:在另一个进程终止时启动特定操作

Bash / upstart-在另一个用户下启动命令,替换当前进程

另一个 Web 进程未能在启动后 60 秒内绑定到 $PORT

Python:启动执行另一个对象方法的新进程