我想要一个脚本来启动一个新进程,以便新进程在初始脚本退出后继续运行。我预计我可以使用multiprocessing.Process
开始一个新进程,并设置daemon=True
,以便主脚本可以在创建的进程继续运行时退出。开始一个单独的过程
但是,当主脚本退出时,似乎第二个进程已悄悄终止。这是预期的行为,还是我做错了什么?
我想要一个脚本来启动一个新进程,以便新进程在初始脚本退出后继续运行。我预计我可以使用multiprocessing.Process
开始一个新进程,并设置daemon=True
,以便主脚本可以在创建的进程继续运行时退出。开始一个单独的过程
但是,当主脚本退出时,似乎第二个进程已悄悄终止。这是预期的行为,还是我做错了什么?
从Python文档:
当一个进程退出时,它会尝试 终止其所有恶魔的孩子 过程。
这是预期的行为。
如果你是在UNIX系统上,可以使用os.fork:
import os
import time
pid=os.fork()
if pid:
# parent
while True:
print("I'm the parent")
time.sleep(0.5)
else:
# child
while True:
print("I'm just a child")
time.sleep(0.5)
运行此创建两个过程。你可以杀死父母而不杀死孩子。 例如,当您运行脚本,你会看到类似这样的:
% script.py
I'm the parent
I'm just a child
I'm the parent
I'm just a child
...
使用Ctrl-Z停止脚本:
^Z
[1]+ Stopped script.py
查找父进程ID号。这将是这两个进程ID号的小,因为家长是先:
% ps axuw | grep script.py
unutbu 6826 0.1 0.1 33792 6388 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py
unutbu 6827 0.0 0.1 33792 4352 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py
unutbu 6832 0.0 0.0 17472 952 pts/24 S+ 15:09 0:00 grep --color=auto script.py
杀死父进程:
恢复script.py前台:
% fg
script.py
Terminated
您会看到子进程仍在运行:
% I'm just a child
I'm just a child
I'm just a child
...
杀子(在一个新的终端)与
% kill 6827
“你可以杀死父母而不杀死孩子。”怎么样? – 2017-08-21 19:00:39
@MartinThoma:我在上面的终端添加了如何做到这一点的细节。许多操作系统都有一个GUI过程监视器,可以使这变得更加容易,但这些细节将是OS/GUI特定的。 – unutbu 2017-08-21 19:15:45
这里是SO,其中一个答案给出了一个很好的解决这个问题的一个相关的问题:
简单使用subprocess
模块:
import subprocess
subprocess.Popen(["sleep", "60"])
谢谢,显然我没有RTFM足够接近。 – JacquesB 2010-06-13 16:11:39