我有以下简化的脚本:
Python test.py
:
import subprocess, os
def run_background_process(script_name):
with open(os.devnull, 'w') as FNULL:
background_process = subprocess.Popen(['nohup', '{}'.format(script_name)], stdout=FNULL
, stderr=FNULL
, stdin=FNULL)
return background_process
while True:
run_background_process('test.sh')
time.sleep(500)
Bash shell脚本test.sh
:
#!/bin/bash
n=1
echo ${n}
sleep 30
ps -ef
结果是:
15536 16555 0 14:18 test.py
15541 15536 0 14:18 test.sh
所以我的问题是,为什么test.sh
没有与test.py
分离,而且它仍然是test.py
的孩子?
答案 0 :(得分:1)
每个子进程仍然是其原始父进程的子进程,除非父进程终止。如果发生这种情况,PID 1的进程将成为孤儿的新父进程。
使用nohup
不会破坏这种关系。 (为此,孩子必须fork
一个新的过程并终止自己,但这是另一个主题)。所以第一个答案是肯定的,孩子仍然是其父母的孩子。
很难直接回答其他问题。 "分离"的含义在你的问题中没有很好的定义。我建议在Unix / Linux中查看有关进程组(进程集合),作业控制,控制终端和会话(进程组集合)的一些教程。
nohup
实用程序的目的是保护启动的进程在您注销时不被终止。退出的shell执行清理并将SIGHUP
信号发送到其控制下的所有进程。此外,在注销期间将关闭使用中的终端设备(键盘输入,屏幕输出)。 nohup
只是确保忽略SIGHUP
并且不使用终端。因此,相应的流程可以在注销后继续工作。