簡體   English   中英

從nohup開始的進程未與父進程分離

[英]Process started with nohup is not detached from parent

我有以下簡化的腳本:

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

除非父進程終止,否則每個子進程仍是其原始父進程的子進程。 如果發生這種情況,則具有PID 1的進程將成為該孤兒的新父代。

使用nohup不會破壞這種關系。 (為此,孩子必須fork一個新進程並終止自身,但這是另一個主題)。 所以第一個答案是肯定的,孩子仍然是其父母的孩子。

直接回答另一個問題很困難。 您的問題中“分離”的含義不是很清楚。 我確實建議查看一些有關Unix / Linux中進程組(進程集合),作業控制,控制終端和會話(進程組集合)的教程。

nohup實用程序的目的是防止注銷時啟動的進程被終止。 退出的外殼執行清除並將SIGHUP信號發送到其控制下的所有進程。 此外,注銷時將關閉正在使用的終端設備(鍵盤輸入,屏幕輸出)。 nohup只是確保SIGHUP被忽略並且不使用終端。 結果,相應的過程可以在注銷后繼續其工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM