簡體   English   中英

在使用 Python 子進程時,為什么 Ctrl-C 不會產生與 kill -2 相同的行為?

[英]When using Python subprocess, why does Ctrl-C not produce the same behavior as kill -2?

如果我通過Ctrl-C殺死 Python 進程,則所有子進程(由subprocess啟動)都會死亡。 但是,如果我通過kill -2殺死 Python 進程,子進程將繼續運行。 我認為Ctrl-C與發送SIGINT相同(即kill -2 )。 為什么行為不同?

python 進程及其由多進程或子進程啟動的子進程都連接到同一個終端——具體來說,它們都是同一個進程組的一部分。 當終端接收到 Ctrl-C 時,它將向連接到終端的所有進程發送 SIGINT,這就是為什么您會看到主 python 線程及其子線程接收到信號的原因。

當您kill -2 PID時,您將 SIGINT 發送到該進程組的特定進程; 不會選擇其他進程。

相反,如果您確實kill -2 -PGID (注意減號和G ),則復制 Ctrl-C 的操作。 這指示 kill 以進程組級別的信號為目標; 組內的所有進程都會收到信號。

您可以運行此命令來查看每個 python 進程的進程組 ID:

ps -o pgid,ppid,pid,lwp,sgi_p,fname,cmd -C python

... 示例 output ....

 PGID  PPID   PID   LWP P COMMAND  CMD
22706 19662 22706 22706 * python   python parent.py
22706 22706 22707 22707 * python   python /var/tmp/child.py
22706 22706 22708 22708 * python   python /var/tmp/child.py
22706 22706 22709 22709 * python   python /var/tmp/child.py
22706 22706 22710 22710 * python   python /var/tmp/child.py
22706 22706 22711 22711 * python   python /var/tmp/child.py

(PGID:組ID,PPID:父ID,PID:進程ID,LWP:線程ID)

...然后將 SIGINT 發送到整個組:

kill -2 -22706

有關 Ctrl-C 和進程組的詳細說明,請參見此處: https://unix.stackexchange.com/questions/149741/why-is-sigint-not-propagated-to-child-process-when-sent-to-its -父進程

暫無
暫無

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

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