【发布时间】:2012-12-05 18:55:16
【问题描述】:
我们已经启动了应该永远运行并在系统启动后立即启动的守护程序,因此在它的 plist 中我们说:
<key>KeepAlive</key>
<true/>
在系统关闭之前一切正常。代理需要通过 HTTP 通知远程服务器系统正在关闭。系统将 SIGTERM 发送给代理就好了,代理能够处理它。但是,当它收到 SIGTERM 时,DNS(或者可能是整个网络子系统)已经关闭,并且它无法将状态发送到服务器,因为它无法解析其名称。所有网络功能都失败了,所以我怀疑网络已经关闭。在 Linux 上,这由具有 NN=99 和 MM=00 的 SNN/KMM 符号链接解决。然而,在 OSX 上明确表示 launchd 守护进程没有任何优先级。那么我们如何让 OSX 在关闭 DNS/网络之前向我们的守护进程发送 SIGTERM?
我很快研究了为系统关闭事件注册监听器的能力,因为程序可以注册自己以监听电源模式更改(即睡眠),但是一些消息来源告诉这也是不可能的 - Receiving power notifications (especially shutdown) on Mac OSX。
【问题讨论】: