我们已经启动了应该永远运行的守护进程,并在系统启动后立即启动,因此在它的plist中我们说:
<key>KeepAlive</key>
<true/>
在系统关闭之前一切正常。代理需要通过HTTP向远程服务器通知正在关闭的系统。系统将SIGTERM发送到代理就好了,代理能够处理它。但是,当它收到SIGTERM时,DNS(或整个网络子系统)已经关闭,并且它无法向服务器发送状态,因为它无法解析其名称。所有网络功能都失败了,所以我怀疑网络功能已关闭。在Linux上,这由SNN / KMM符号链接解决,NN = 99且MM = 00。但是在OSX上明确表示launchd守护进程没有任何优先级。那么我们怎样才能让OSX在关闭DNS /网络之前将SIGTERM发送到我们的守护进程?
我很快就看到了为系统关闭事件注册监听器的能力,因为程序可以注册自己来监听电源模式的变化(即睡眠),但是有些消息来源说这也是不可能的 - {{3} }。
答案 0 :(得分:0)
我怀疑会有一个分发通知通知应用程序这个,所以我写了一个小的Obj-C应用......
#import <Foundation/Foundation.h>
int main(int argc, char *argv[])
{
@autoreleasepool
{
[[NSDistributedNotificationCenter defaultCenter]
addObserverForName: nil
object: nil
queue: [NSOperationQueue mainQueue]
usingBlock: ^(NSNotification *notification) {
NSLog(@"Got a notification %@", notification);
}];
[[NSRunLoop mainRunLoop] run];
}
}
我收到了这些通知
05/12/2012 19:17:12.044 Untitled 2[62058]: Got a notification __CFNotification 0x7ffd98e04900 {name = com.apple.logoutInitiated; object = 501}
05/12/2012 19:17:22.376 Untitled 2[62058]: Got a notification __CFNotification 0x7ffd98c0c580 {name = com.apple.shutdownInitiated; object = 501}
05/12/2012 19:17:22.388 Untitled 2[62058]: Got a notification __CFNotification 0x7ffd98c0b8f0 {name = com.apple.logoutContinued; object = 501}
com.apple.logoutInitiated
对应于关闭对话框的打开,com.apple.shutdownInitiated
。现在,您当然不知道关闭是否真的会发生,应用程序可以取消关闭。不过,你可能也会收到通知。