0

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

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

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

我已经快速查看了为系统关闭事件注册侦听器的能力,因为程序可以注册自己以侦听电源模式更改(即睡眠),但是一些消息来源告诉这也是不可能的 -接收电源通知(尤其是关机)在 Mac OSX 上

4

1 回答 1

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按下按钮时收到。

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

于 2012-12-05T19:22:53.620 回答