2017-09-25 4 views
0

Je suis nouveau sur Mac OSX et j'essaye de développer un démon (je suis familier avec les services de Windows, et essayant de réaliser à peu près les mêmes choses).Mac OSX LaunchDaemon exécuter quelque chose sur le déchargement

Ce que je l'ai fait jusqu'à présent:

géré pour écrire un fichier plist dans LaunchDaemons (j'ai découvert que ces daemons courent sous le compte système, pas à l'utilisateur, comme un service Windows avec les autorisations système local).

J'ai réussi à le faire tourner au démarrage, et exécuter ma simple application hello world qui écrit simplement quelque chose dans un fichier toutes les 10 secondes. Le problème est, quand je décharge le démon avec launchd, il tue juste mon processus. Est-ce que le démon peut exécuter un autre programme en cours de déchargement ou communiquer à mon processus qu'il est en train de s'éteindre pour que je puisse effectuer une action de déchargement dans mon code?

Merci

Répondre

1

Le cycle de vie d'un démon est documenté par Apple et ils décrivent comment gérer Terminating Processes

Si vous utilisez Objective-c ou Swift, vous devriez être en mesure de mettre en œuvre le délégué applicationshouldterminate méthode.

Si vous ne l'utilisez Cocoa:

applications non-cacao reçoivent un événement Apple « Quitter l'application » (kAEQuitApplication), par courtoisie, pour leur donner une chance de fermer gracieusement

Enfin, puisque vous utilisez un démon (processus d'arrière-plan)

Pour les processus d'arrière-plan, la procédure est un peu différent. Le programme loginwindow notifie au processus qu'il est sur le point d'être terminé en lui envoyant un événement Apple Quitter l'application (kAEQuitApplication). Contrairement aux processus de premier plan, loginwindow n'attend pas de réponse. Il met fin à tous les processus d'arrière-plan ouverts en envoyant un signal SIGKILL, quelles que soient les erreurs renvoyées.

Si le système est arrêté ou redémarré, il envoie un signal SIGTERM à tous les démons, suivi quelques secondes plus tard par le signal SIGKILL.

Il y a une discussion sur la manipulation SIGTERM here.

+0

Ceci est très utile, merci. Mon application est écrite en .Net Core, j'essaierai de trouver un moyen de recevoir l'évènement kAEQuitApplication. Cependant, dans mon fichier plist, je lance effectivement "dotnet" avec mon assembly comme argument, donc cela peut être un peu compliqué. Je vous ferai savoir si j'ai des résultats. –