从nohup开始的进程不是从父进程中分离出来的

时间:2017-03-05 12:21:44

标签: python linux bash shell subprocess

我有以下简化的脚本:

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的孩子?

1 个答案:

答案 0 :(得分:1)

每个子进程仍然是其原始父进程的子进程,除非父进程终止。如果发生这种情况,PID 1的进程将成为孤儿的新父进程。

使用nohup不会破坏这种关系。 (为此,孩子必须fork一个新的过程并终止自己,但这是另一个主题)。所以第一个答案是肯定的,孩子仍然是其父母的孩子。

很难直接回答其他问题。 "分离"的含义在你的问题中没有很好的定义。我建议在Unix / Linux中查看有关进程组(进程集合),作业控制,控制终端和会话(进程组集合)的一些教程。

nohup实用程序的目的是保护启动的进程在您注销时不被终止。退出的shell执行清理并将SIGHUP信号发送到其控制下的所有进程。此外,在注销期间将关闭使用中的终端设备(键盘输入,屏幕输出)。 nohup只是确保忽略SIGHUP并且不使用终端。因此,相应的流程可以在注销后继续工作。