【发布时间】:2020-02-03 00:39:31
【问题描述】:
我正在编写一个在后台作为守护进程运行的 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 行,我的应用程序几乎会立即停止,但我需要让它保持活动状态。同时,我在想那条线可能阻塞了主线程并阻止了信号处理程序的运行。有什么方法可以解决这个问题,以便我可以优雅地处理我的应用程序终止?
【问题讨论】:
标签: swift macos kill-process sigint sigterm