Процесс python и его дочерние элементы, запущенные многопроцессорным процессом или подпроцессом, все подключены к одному и тому же терминалу, в частности, все они являются частью одной группы процессов . Когда терминал получает Ctrl-C, он отправляет SIGINT всем процессам, подключенным к терминалу, поэтому вы видите, что основной поток Python и его дочерние элементы получают сигнал.
Когда вы делаете kill -2 PID
, выотправляют SIGINT конкретному процессу этой группы процессов;другие процессы не будут выбраны.
Если вместо этого вы сделаете kill -2 -PGID
(обратите внимание на знак минус и G
), вы повторяете действие Ctrl-C. Это дает команду kill для нацеливания сигнала на уровне группы процессов;все процессы в группе получат сигнал.
Вы можете запустить эту команду, чтобы увидеть идентификатор группы процессов для каждого из ваших процессов python:
ps -o pgid,ppid,pid,lwp,sgi_p,fname,cmd -C python
... пример вывода .. ..
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: идентификатор группы, PPID: идентификатор родителя, PID: идентификатор процесса, LWP: идентификатор потока)
... затем для отправки SIGINT всей группе:
kill -2 -22706
Подробное описание Ctrl-C и групп процессов см. Здесь: https://unix.stackexchange.com/questions/149741/why-is-sigint-not-propagated-to-child-process-when-sent-to-its-parent-process