0

永久に実行され、システムが起動するとすぐに開始されるlaunchdデーモンがあるため、その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 に答える