OSX,关闭launchd守护进程并且网络不可用

时间:2012-12-05 18:55:16

标签: macos launchd

我们已经启动了应该永远运行的守护进程,并在系统启动后立即启动,因此在它的plist中我们说:

<key>KeepAlive</key> <true/>

在系统关闭之前一切正常。代理需要通过HTTP向远程服务器通知正在关闭的系统。系统将SIGTERM发送到代理就好了,代理能够处理它。但是,当它收到SIGTERM时,DNS(或整个网络子系统)已经关闭,并且它无法向服务器发送状态,因为它无法解析其名称。所有网络功能都失败了,所以我怀疑网络功能已关闭。在Linux上,这由SNN / KMM符号链接解决,NN = 99且MM = 00。但是在OSX上明确表示launchd守护进程没有任何优先级。那么我们怎样才能让OSX在关闭DNS /网络之前将SIGTERM发送到我们的守护进程?

我很快就看到了为系统关闭事件注册监听器的能力,因为程序可以注册自己来监听电源模式的变化(即睡眠),但是有些消息来源说这也是不可能的 - {{3} }。

1 个答案:

答案 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

现在,您当然不知道关闭是否真的会发生,应用程序可以取消关闭。不过,你可能也会收到通知。