繁体   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