Я пишу приложение для Mac, которое работает в качестве демона в фоновом режиме. Как я могу определить, когда приложение убито, и запустить код очистки? Я пытался перехватить сигналы, такие как SIGTERM
, SIGINT
и SIGKILL
, но в структуре моего приложения, похоже, есть некоторые проблемы.
Это основной поток запуска моего приложения из основногонить:
func signalHandler(signal: Int32) { ... }
let signals = [SIGINT, SIGTERM, SIGKILL]
for sig in signals {
signal(sig, signalHandler)
}
// code to kick off background execution that will occasionally need to run some stuff on the main thread
RunLoop.current.run() // SIGTERM shows up in Xcode on this line, signalHandler not called
Если я остановлю приложение, используя кнопку остановки Xcode или принудительно выйду из Монитора активности, приложение просто закроется с кодом выхода 9 (SIGKILL
). Если я выберу «Выход» на мониторе активности, приложение получит SIGTERM
, но обработчик не будет вызван ... Xcode просто выделяет строку RunLoop
и говорит: Thread 1: signal SIGTERM
.
Безстрока RunLoop
мое приложение будет остановлено почти сразу, но мне нужно сохранить его. В то же время я думаю, что, возможно, эта строка блокирует основной поток и не позволяет запустить обработчик сигналов. Есть ли способы обойти это, чтобы я мог изящно обрабатывать завершение моего приложения?