Python обрабатывает завершение работы системы, но не сбой (или как я хотел бы восстановить состояние в случае чего-то неожиданного)

#python #systemd #shutdown

Вопрос:

Итак, у меня есть API Flask, работающий через службу Systemd, работающую на аппаратном обеспечении, работающем от батареи (для управления другим оборудованием). У меня есть куча состояний, которые мне нужно сохранить, и в случае, если что-то пойдет не так, например, отключение электроэнергии, мне нужно иметь возможность восстановить это состояние.

Прямо сейчас я сохраняю состояние в виде файлов JSON, чтобы я мог загрузить их (если они существуют) при запуске. Но мне также нужно будет иметь возможность удалить их снова в случае, если он получит сигнал об отключении.

Я видел, что где-то я мог бы установить killSignal на SIGINT и обрабатывать завершение работы как прерывание клавиатуры. Или что — то насчет ExecStop. Будет ли этого достаточно, или есть лучший способ справиться с таким сценарием?

Ответ №1:

Если вы посмотрите на журналы завершения работы системы Linux, вы увидите » отправка sigterm всем процессам… отправка sigkill всем процессам». При обычном выключении процессы получают несколько секунд отсрочки, прежде чем быть убитыми. Поэтому, если вы поймаете sigterm, вы можете запустить свой код завершения работы, но лучше, чтобы это закончилось до того, как появится неуловимый sigkill. Поскольку sigterm всегда отправляется для уничтожения запущенного процесса, его захват действительно является правильным способом (TM) очистки при выходе. Но поскольку вы используете службы systemd, вы также можете выполнить очистку в службе.

Комментарии:

1. Правильно, и я полагаю, что таким образом я смог бы отличить завершение работы от внутренней ошибки. И я, вероятно, мог бы использовать окно между sigterm и kill, так как все, что я сделал бы, это удалил файл json