При использовании подпроцесса Python, почему Ctrl-C не производит такое же поведение, как kill -2? - PullRequest
3 голосов
/ 09 ноября 2019

Если я убиваю процесс Python через Ctrl-C, все дочерние процессы (запущенные subprocess) умирают. Однако, если я убью процесс Python с помощью kill -2, дочерние процессы продолжат работать. Я думал, что Ctrl-C - это то же самое, что отправка SIGINT (т. Е. kill -2). Почему поведение отличается?

1 Ответ

3 голосов
/ 11 ноября 2019

Процесс 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...