Отключение системы обработки LaunchDaemon - нет SIGTERM? - PullRequest
1 голос
/ 24 ноября 2011

Я написал небольшой скрипт на python, который я запускаю как LaunchDaemon для записи времени запуска / завершения работы в удаленной базе данных.Когда скрипт запускается, он записывает время запуска, затем делает паузу и ждет, чтобы поймать SIGTERM, чтобы записать время выключения.Почти идентичный рабочий процесс используется в качестве LaunchAgent для времени входа / выхода из системы.

Однако, похоже, что механизм внезапного завершения работы Apple бросает рывок в вещи.Похоже, что когда машина выключена или перезапущена, launchd отправляет только сигнал SIGKILL запускающим демонам и агентам запуска, которые не могут быть обработаны.Я могу ошибаться в технических деталях, но по сути это то, что я испытываю ..

Ручная загрузка / выгрузка демона с помощью launchctl запускает обработчик SIGTERM.Тем не менее, тот же код не срабатывает при реальном выключении системы.

У кого-нибудь есть рекомендации по предотвращению SIGKILL?

1 Ответ

4 голосов
/ 24 ноября 2011

Если я читаю это правильно, он не должен использовать внезапное завершение для демонов, если у вас нет <key>EnableTransactions</key><true/> в списке запуска. Но документы немного расплывчаты, поэтому я бы также попытался добавить <key>EnableTransactions</key><false/> к списку, или, если это не сработает, вызовите vproc_transaction_begin из вашей программы (я предполагаю, что вы можете вызвать его из python, но я не знаю, механика).

...