2017-09-25 1 views
0

Ich bin neu bei Mac OSX und ich versuche, einen Daemon zu entwickeln (ich bin vertraut mit Windows-Diensten und versuche, über die gleichen Dinge zu erreichen).Mac OSX LaunchDaemon etwas beim Entladen ausführen

Was ich bisher tat:

Managed eine plist-Datei in LaunchDaemons schreiben (ich fand heraus, dass diese Dämonen unter Systemkonto ausgeführt wird, nicht vom Benutzer, wie ein Windows-Dienst mit lokalen Systemberechtigungen).

Ich schaffte es, es beim Start zu starten, und führen Sie meine einfache Hallo Welt-Anwendung, die nur alle 10 Sekunden etwas in eine Datei schreibt.

Das Problem ist, wenn ich den Daemon mit Launchd entladen, es tötet nur meinen Prozess. Ist es möglich, dass der Daemon beim Entladen etwas anderes ausführt oder mit meinem Prozess kommuniziert, dass er heruntergefahren wird, damit ich eine Entladeaktion in meinem Code ausführen kann?

Danke

Antwort

1

Der Lebenszyklus eines Daemon von Apple dokumentiert und sie beschreiben, wie Terminating Processes

zu behandeln Wenn Sie Objective-C oder Swift verwenden, sollten Sie in der Lage sein, die applicationshouldterminate Delegierten zu implementieren Methode.

Wenn Sie nicht Cocoa mit:

Non-Cocoa-Anwendungen erhalten eine „Anwendung beenden“ Apple-Event (kAEQuitApplication), als Höflichkeit, ihnen eine Chance zu geben, anmutig herunterzufahren

Schließlich

, da Sie einen Daemon (Hintergrundprozess) läuft

Für Hintergrundprozesse, ist das Verfahren ein wenig anders. Das loginwindow-Programm benachrichtigt den Prozess, der beendet werden soll, indem es ein App-Beenden-Ereignis (kAEQuitApplication) sendet. Im Gegensatz zu Vordergrundprozessen wartet das loginwindow jedoch nicht auf eine Antwort. Es wird damit begonnen, alle offenen Hintergrundprozesse zu beenden, indem ein SIGKILL-Signal gesendet wird, unabhängig von irgendwelchen zurückgegebenen Fehlern.

Wenn das System heruntergefahren oder neu gestartet wird, sendet es ein Signal SIGTERM an alle Daemons, gefolgt von einem Signal SIGKILL einige Sekunden später.

Es gibt eine Diskussion über SIGTERM Umgang here.

+0

Das ist ganz hilfreich, danke. Meine Anwendung ist in .Net Core geschrieben, ich werde versuchen, eine Möglichkeit zu finden, das kAEQuitApplication-Ereignis dort zu empfangen. In meiner plist-Datei liefere ich jedoch "dotnet" mit meiner Assembly als Argument, also könnte es ein bisschen knifflig sein. Ich lasse Sie wissen, wenn ich ein paar Ergebnisse bekomme. –