9 votes

Comment faire pour que Mac OS X exécute un programme avant de s'éteindre ?

J'essaie de faire en sorte que Mac OS X sauvegarde toutes mes VM de VirtualBox lorsqu'il redémarre. J'ai déjà un script qui fait cela, mais j'ai besoin qu'OS X exécute ce script automatiquement avant un redémarrage.

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

Ou comment y parvenir autrement ?

5voto

Oskar Points 1242

Launchd envoie un avertissement précoce d'arrêts à tous les scripts/daemons qui ont une Sous-routine StopService() . Cela donne à votre processus le plus de temps possible pour se nettoyer.

Il suffit d'utiliser launchd pour lancer le script et de le faire tourner en arrière-plan jusqu'à ce qu'il soit temps de sortir.

Après que les services qui ont reçu l'alerte précoce aient fermé leurs portes, Tous les processus obtenir un SIGTERM quelques secondes avant que le SIGKILL les atomise.

Vous pourriez faire un script qui dort et piège SIGTERM pour exécuter votre commande au moment voulu. 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 faire un démon à partir d'un script de shell.


D'un point de vue historique - /sbin/reboot et les niveaux d'exécution n'ont jamais existé sur Darwin / OS X et rc.shutdown est déprécié avec le reste de rc maintenant que launchd est le patron. Vous pourriez être en mesure d'utiliser rc.shutdown sur tiger ou plus ancien (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 pourriez vouloir voir si veilleur de nuit serait utile dans votre cas. Je ne l'ai pas utilisé depuis un certain temps, mais il vise certainement à résoudre votre dilemme.

5voto

llange Points 524

Bien qu'Apple recommande d'utiliser " lancé sur le marché ", le plus simple est de créer un shell script 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!'

Alors donnez des droits d'exécution :

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

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

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

Si vous lancez une autre application, comme je ne l'ai pas testé, 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 ;

  • Ensuite, envoyez-en un nouveau (attention à ne pas tuer le signal envoyé par notre propre équipe).
    script)


Si vous voulez enlever le crochet :

sudo defaults delete com.apple.loginwindow LogoutHook

Si vous utilisez " lancé sur le marché ", l'idée serait de capturer le signal SIGTERM. Jetez un coup d'oeil à : /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X