LaunchDaemon 处理系统关闭 - 没有 SIGTERM?

jor*_*aff 2 python macos launchd

我编写了一个小的 python 脚本,将其作为 LaunchDaemon 运行,以将启动/关闭时间记录到远程数据库。当脚本启动时,它会记录启动时间,然后暂停并等待捕获 SIGTERM 以记录关闭时间。几乎相同的工作流程被用作登录/注销时间的启动代理。

然而,苹果公司的突然终止机制似乎给事情带来了麻烦。看来,当机器关闭或重新启动时,launchd只是SIGKILL向launchdaemons和launchagents发送信号,无法处理。我可能在技术细节上是错误的,但这本质上就是我所经历的。

使用 launchctl 手动加载/卸载守护进程会触发处理程序SIGTERM。然而,当系统真正关闭时,不会触发相同的代码。

有人对如何预防有建议吗SIGKILL

Gor*_*son 5

如果我没看错的,它不应该在守护进程上使用突然终止,除非你 <key>EnableTransactions</key><true/>在 launchd plist 中。但文档有点模糊,所以我也尝试添加<key>EnableTransactions</key><false/>到 plist,或者如果这不起作用,请从您的程序中调用 vproc_transaction_begin (我假设您可以从 python 调用它,但我不知道机制) 。