LaunchDaemon 处理系统关机 - 没有 SIGTERM?
我写了一个小的Python脚本,作为一个启动守护进程来记录开机和关机的时间,并把这些信息存到一个远程数据库里。当这个脚本启动时,它会记录开机时间,然后暂停,等待接收一个叫做SIGTERM的信号,以便记录关机时间。几乎相同的流程也被用来记录登录和注销的时间,作为一个登录代理。
不过,似乎苹果的突然终止机制给这个过程带来了麻烦。看起来当机器关机或重启时,launchd
只会发送一个SIGKILL
信号给启动守护进程和启动代理,而这个信号是无法被处理的。我可能在技术细节上有些错误,但这就是我所经历的情况。
手动用launchctl加载或卸载守护进程时,会触发SIGTERM
的处理程序。然而,当真正的系统关机发生时,那段代码却没有被触发。
有没有人有什么建议,能防止SIGKILL
的发生?
1 个回答
5
如果我理解得没错,这篇文章说的是,除非在launchd的plist文件里有 <key>EnableTransactions</key><true/>
,否则不应该让后台程序突然终止。不过文档的说明有点模糊,所以我建议你可以试着在plist里加上 <key>EnableTransactions</key><false/>
,或者如果这样不行的话,可以在你的程序里调用vproc_transaction_begin(我想你可以在python里调用这个,但具体怎么做我就不太清楚了)。