Я пытаюсь поймать SIGINT
(или прерывание клавиатуры) в программе Python 2.7. Вот как выглядит мой тест Python script test
:
#!/usr/bin/python
import time
try:
time.sleep(100)
except KeyboardInterrupt:
pass
except:
print "error"
Далее у меня есть оболочка script test.sh
:
./test & pid=$!
sleep 1
kill -s 2 $pid
Когда я запускаю script с помощью bash, или sh, или что-то bash test.sh
, процесс Python test
остается запущенным и не может быть уничтожен с помощью SIGINT
. Если я копирую команду test.sh
и вставляю ее в терминал (bash), процесс Python test
отключается.
Я не могу понять, что происходит, что я хотел бы понять. Итак, где разница и почему?
Это не о том, как поймать SIGINT
в Python! Согласно docs - это способ, который должен работать:
Python устанавливает небольшое количество обработчиков сигналов по умолчанию: SIGPIPE... и SIGINT преобразуется в исключение KeyboardInterrupt
Это действительно ловит KeyboardInterrupt
, когда SIGINT
отправляется kill
, если программа запускается непосредственно из оболочки, но когда программа запускается из bash script на фоновом режиме, кажется, что KeyboardInterrupt
никогда не поднимается.