[英]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.