Первое, что вам нужно понять, это то, что ctrl + c вызывает сигнал для отправки в группу процессов задачи foregrand.Второе, что вам нужно знать, это то, что в группу процессов входит ваш процесс Python и его открытые подпроцессы.
Например, я воссоздаю ваш эксперимент без iPython, используя 4-строчный скрипт:
import subprocess, os
pipe1 = subprocess.Popen('sleep 500', shell=True)
pipe2 = subprocess.Popen('sleep 500', shell=True)
pipe3 = subprocess.Popen('tail -f /var/log/syslog', shell=True).wait()
Как вы можете видеть, это открывает две трубы для sleep
(которые ничего не делают в течение 500 секунд) и одну трубу для tail
и следуют /var/log/syslog
.
Теперь, когда это работаетЯ собираюсь набрать ps ax -O tpgid
в другом терминале и увидеть мои запущенные процессы , включая их идентификатор группы :
24083 24083 S pts/9 00:00:00 python3 foo.py
24084 24083 S pts/9 00:00:00 /bin/sh -c sleep 500
24085 24083 S pts/9 00:00:00 sleep 500
24086 24083 S pts/9 00:00:00 /bin/sh -c sleep 500
24087 24083 S pts/9 00:00:00 sleep 500
24088 24083 S pts/9 00:00:00 /bin/sh -c tail -f /var/log/syslog
24089 24083 S pts/9 00:00:00 tail -f /var/log/syslog
Первый столбец - это идентификатор процесса, второй -ID группы, который важен.
Если я запускаю kill -INT 24083
, который отправляет сигнал INT
(прерывание) в группу процессов 24083 , все процессы в этой группе получаютподайте сигнал и выйдите соответственно.
Вот что происходит с вами, когда вы нажимаете Ctrl + C.Группа процессов получает сигнал, и ожидается, что каждый процесс завершит работу в соответствии со стандартом POSIX.