Я пытаюсь поймать 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 никогда не поднимается.