Comment puis-je faire exécuter un programme à Mac OS X avant de fermer?

9

J'essaie d'obtenir Mac OS X pour enregistrer toutes mes machines virtuelles VirtualBox lors de son redémarrage. J'ai déjà un script qui fait cela, mais j'ai besoin d'OS X pour exécuter ce script automatiquement avant un redémarrage.

Lorsque Mac OS X redémarre, exécute-t-il / sbin / reboot?

Ou comment pourrait-on y parvenir autrement?

Andrew J. Brehm
la source
Question en double ici: apple.stackexchange.com/questions/16825/…
michaelmichael
Ce n'est pas un doublon. Je ne veux pas savoir comment exécuter un script ou un programme lors de la déconnexion. Je veux savoir comment exécuter un script ou un programme lors de l'arrêt.
Andrew J.Brehm
1
Tu as raison. Pas un double exact. La réponse dans la question liée conseille à l'utilisateur de placer son script /etc/rc.shutdown.localpour l'exécuter lors de l'arrêt. Il semble que c'est ce que vous recherchez.
michaelmichael
Ce site semble faire cette affirmation: hints.macworld.com/article.php?story=20051013141919568
Andrew J. Brehm
La méthode rc.shutdown.local ne fonctionne pas.
Andrew J.Brehm

Réponses:

5

Bien qu'Apple recommande d'utiliser " launchd ", le plus simple est de créer un script shell en utilisant, par exemple, le pico de Terminal:

pico /Users/Shared/logoutHook.sh

Le fichier peut contenir quelque chose comme:

#!/bin/bash
say 'Hasta la vista baby!'

Donnez ensuite des droits d'exécution:

sudo chmod +x /Users/Shared/logoutHook.sh

Enfin, connectez le script à la procédure de déconnexion:

sudo defaults write com.apple.loginwindow LogoutHook /Users/Shared/logoutHook.sh

Si vous démarrez une autre application, comme je n'ai pas testé cela, je pense qu'il pourrait être utile de m'avertir et de vous avertir que:

  • Nous pourrions avoir besoin de tuer le signal d'arrêt pour exécuter ce que nous voulons;

  • Envoyez ensuite un nouveau (attention à ne pas tuer le signal envoyé par notre propre
    script)…


Si vous souhaitez retirer le crochet:

sudo defaults delete com.apple.loginwindow LogoutHook

Si vous utilisez " launchd ", l'idée serait de capturer le signal SIGTERM. Jetez un œil à: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist

llange
la source
4

Launchd envoie une alerte précoce d'arrêts à tous les scripts / démons qui ont un sous-programme StopService () . Cela donne à votre processus le plus de temps pour nettoyer.

Utilisez simplement launchd pour démarrer le script et l'exécuter en arrière-plan jusqu'à ce qu'il soit temps de quitter.

Après la fermeture des services qui ont reçu l'alerte précoce, tous les processus reçoivent un SIGTERMsignal quelques secondes avant de les SIGKILLneutraliser.

Vous pouvez créer un script qui dort et intercepte SIGTERM pour exécuter votre commande le moment venu. Vous devrez voir si cela laisse suffisamment de temps en pratique pour que les commandes s'exécutent. Cela évite un peu de codage, mais pas beaucoup - il est généralement préférable de simplement créer un démon à partir d'un script shell.


D'un point de vue historique - /sbin/rebootet les niveaux d'exécution n'ont jamais existé sur Darwin / OS X et rc.shutdownsont déconseillés avec le reste de rcmaintenant qui launchdest le patron. Vous pourriez peut-être utiliser rc.shutdown sur tiger ou plus tôt (je n'ai pas une de ces images à portée de main pour vérifier actuellement) Lion a certainement supprimé tous les vestiges de rc.d et init.d.

Vous voudrez peut-être voir si le somnifère pourrait vous aider dans votre cas. Je ne l'ai pas utilisé depuis longtemps - mais il vise certainement à résoudre votre dilemme.

bmike
la source
Il s'avère que "obsolète" signifie "ne fonctionne pas". :-(
Andrew J.Brehm
Yup - les avertissements ont commencé sur Tiger et je suppose que cela a disparu avec Leopard - il est difficile de se rappeler avec tous les changements de Lion qui courent dans mon cerveau.
bmike
Cela complique vraiment les choses et fait de Mac OS X une très mauvaise plateforme de serveur.
Andrew J.Brehm
launchd est entièrement capable d'exécuter des scripts à l'arrêt. Je devrais peut-être éditer l'historique et laisser ce fait plus clair. De quelle manière launchd ne répond pas à votre besoin d'exécuter un script à l'arrêt?
bmike
Je ne sais pas comment créer des scripts d'exécution launchd à l'arrêt. J'utilise launchd pour démarrer les choses au démarrage.
Andrew J.Brehm