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