import subprocess
f = subprocess.Popen(['python', 'a.py'])
time.sleep(3000)
a.py
import time
time.sleep(1000)
運行Python b.py,按CTRL + C,這兩個過程將終止。
但是,將信號SIGINT發送到父進程b.py,kill -2 xxxx,但子進程a.py仍然存在。
import subprocess
f = subprocess.Popen(['python', 'a.py'])
time.sleep(3000)
a.py
import time
time.sleep(1000)
運行Python b.py,按CTRL + C,這兩個過程將終止。
但是,將信號SIGINT發送到父進程b.py,kill -2 xxxx,但子進程a.py仍然存在。
Ctrl-C
在您的終端通常前臺進程組在發送SIGINT
到所有進程。你的父母和你的孩子進程都在這個進程組中。
如需更詳細的說明,請參見例如The TTY demystified或Process Groups and Sessions
更多的技術版本由Kirk McKusick如果你只是殺死父母的過程中,孩子是父母雙亡的孤兒因而被重設父以PID 1(在裏面)。你也可以在ps
的輸出中看到。由於你的子過程從來沒有收到信號,它只是繼續運行。
是的,那正是我需要的。我不在乎一個孤兒過程,我的最初目的是保持它即使父過程死亡也能運行。然後ctrl + c的問題來打擾我。看起來我必須在前臺過程中捕獲這些信號。 – user3201982 2015-03-13 08:51:45
我想你想要的是*守護*孩子。實際上有一個PEP:https://www.python.org/dev/peps/pep-3143/ – dhke 2015-03-13 08:55:34
這個文件太複雜了,我不明白。我可以使用subprocess.Popen來運行一個新的進程嗎?當然,將preexec_fn參數設置爲os.setsid(),以便使子進程與父進程組分離。 – user3201982 2015-03-13 09:35:53
是什麼讓你認爲CTRL-C作爲一個SIGINT來處理? – 2015-03-13 07:59:07
錯字。 SIGINT。無論如何,我正在談論信號2 – user3201982 2015-03-13 08:01:38
同樣的問題,是什麼讓你認爲CTRL-C是一個簡單的SIGINT?你在使用什麼操作系統? – 2015-03-13 08:05:22