Wie kann ich Mac OS X dazu bringen, ein Programm auszuführen, bevor es heruntergefahren wird?

Ich versuche, Mac OS X dazu zu bringen, alle meine VirtualBox-VMs beim Neustart zu speichern. Ich habe bereits ein Skript, das dies tut, aber ich brauche OS X, um dieses Skript vor einem Neustart automatisch auszuführen.

Wenn Mac OS X neu startet, wird /sbin/reboot ausgeführt?

Oder wie könnte man das sonst erreichen?

Das ist kein Duplikat. Ich möchte nicht wissen, wie man beim Abmelden ein Skript oder Programm ausführt. Ich möchte wissen, wie man beim Herunterfahren ein Skript oder Programm ausführt.
Du hast recht. Kein exaktes Duplikat. Die Antwort in der verknüpften Frage rät dem Benutzer, sein Skript /etc/rc.shutdown.localzu platzieren, um es beim Herunterfahren auszuführen. Es hört sich so an, als ob Sie danach suchen.
Diese Seite scheint diesen Anspruch zu erheben: hints.macworld.com/article.php?story=20051013141919568
Die Methode rc.shutdown.local funktioniert nicht.

Antworten (2)

Launchd sendet eine Frühwarnung vor dem Herunterfahren an alle Skripte/Daemons, die eine StopService()-Subroutine haben . Dies gibt Ihrem Prozess die meiste Zeit zum Aufräumen.

Verwenden Sie einfach launchd, um das Skript zu starten, und lassen Sie es im Hintergrund laufen, bis es Zeit zum Beenden ist.

Nachdem die Dienste, die die Frühwarnung erhalten haben, geschlossen werden, erhalten alle Prozesse ein SIGTERMSignal einige Sekunden vor den SIGKILLAtomwaffen.

Sie könnten ein Skript erstellen, das SIGTERM in den Ruhezustand versetzt und abfängt, um Ihren Befehl auszuführen, wenn diese Zeit gekommen ist. Sie müssen sehen, ob das in der Praxis genug Zeit für die Ausführung der Befehle lässt. Dies vermeidet ein wenig Codierung, aber nicht viel - es ist im Allgemeinen besser, einfach einen Daemon aus einem Shell-Skript zu machen.


Aus historischer Sicht - /sbin/rebootund Runlevels gab es nie auf Darwin / OS X und ist zusammen mit dem Rest von nun rc.shutdownan veraltet , das ist der Boss. Möglicherweise können Sie rc.shutdown auf Tiger oder früher verwenden (ich habe derzeit keines dieser Bilder zur Hand, um es zu überprüfen). Lion hat sicherlich alle Überreste von rc.d und init.d entfernt.rclaunchd

Vielleicht möchten Sie sehen, ob Sleepwatcher in Ihrem Fall helfen würde. Ich habe es schon eine ganze Weile nicht mehr benutzt - aber es zielt sicherlich darauf ab, Ihr Dilemma zu lösen.

Obwohl Apple die Verwendung von " launchd " empfiehlt , ist es am einfachsten, ein Shell-Skript zu erstellen, indem Sie beispielsweise pico von Terminal verwenden:

pico /Users/Shared/logoutHook.sh

Die Datei kann Folgendes enthalten:

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

Dann Ausführungsrechte erteilen:

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

Verknüpfen Sie schließlich das Skript mit dem Abmeldevorgang:

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

Wenn Sie eine andere Anwendung starten, da ich diese nicht getestet habe, denke ich, dass es nützlich sein könnte, mich und Sie zu warnen:

  • Möglicherweise müssen wir das Abschaltsignal abschalten, um das auszuführen, was wir wollen.


  • Senden Sie dann ein neues (achten Sie darauf, das von unserem eigenen Skript gesendete Signal nicht zu zerstören )…


Wenn Sie den Haken entfernen möchten:

sudo defaults delete com.apple.loginwindow LogoutHook

Wenn Sie " launchd " verwenden, wäre die Idee, das SIGTERM-Signal zu erfassen. Schau mal in: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist