Вы заметите, что обычно можете прерывать циклы оболочки. Например, этот цикл завершится очень хорошо, когда вы нажмете Ctrl-C:
while true; do sleep 10; done
Родительский процесс - здесь оболочка - может определить, нормально ли завершился дочерний процесс или он был убитсигнал. Если он был убит сигналом, оболочка сочтет сигнал необработанным и остановит цикл и / или скрипт. Если дочерний объект получает сигнал, но выходит нормально, оболочка посчитает, что он обработан, и продолжит.
Когда процесс хочет выполнить некоторую очистку, он обязательно обрабатывает сигнал и, следовательно, не уничтожается. Таким образом, каноническое поведение Unix заключается в том, что когда очистка завершена, удалить обработчик сигнала и заново убить себя:
import time
import os
import signal
try:
time.sleep(10);
except KeyboardInterrupt:
print('exit')
signal.signal(signal.SIGINT, signal.SIG_DFL)
os.kill(os.getpid(), signal.SIGINT)
Поскольку причина смерти правильно передается обратно в оболочку, вы теперь будетевозможность Ctrl-C из вашего while true; do python yourfile.py; done
цикла.