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

9

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 benötige OS X, um dieses Skript vor einem Neustart automatisch auszuführen.

Wird Mac OS X beim Neustart / sbin / reboot ausgeführt?

Oder wie könnte dies sonst erreicht werden?

Andrew J. Brehm
quelle
Doppelte Frage hier: apple.stackexchange.com/questions/16825/…
michaelmichael
Das ist kein Duplikat. Ich möchte nicht wissen, wie ein Skript oder Programm beim Abmelden ausgeführt wird. Ich möchte wissen, wie ein Skript oder Programm beim Herunterfahren ausgeführt wird.
Andrew J. Brehm
1
Du hast recht. Kein genaues Duplikat. Die Antwort in der verknüpften Frage empfiehlt 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.
Michaelmichael
Diese Seite scheint diese Behauptung aufzustellen
Andrew J. Brehm
Die Methode rc.shutdown.local funktioniert nicht.
Andrew J. Brehm

Antworten:

5

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

pico /Users/Shared/logoutHook.sh

Die Datei kann Folgendes enthalten:

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

Dann geben Sie Ausführungsrechte:

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

Schließen Sie das Skript schließlich an die Abmeldeprozedur an:

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

Wenn Sie eine andere Anwendung starten, da ich diese noch nicht getestet habe, kann es hilfreich sein, mich und Sie zu warnen, dass:

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

  • Dann senden Sie ein neues (achten Sie darauf, das von unserem eigenen
    Skript gesendete Signal nicht zu töten )…


Wenn Sie den Haken entfernen möchten:

sudo defaults delete com.apple.loginwindow LogoutHook

Bei Verwendung von " launchd " besteht die Idee darin, das SIGTERM-Signal zu erfassen. Schauen Sie sich Folgendes an: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist

llange
quelle
4

Launchd sendet eine Frühwarnung vor Herunterfahren an alle Skripte / Daemons, die über eine StopService () - Unterroutine verfügen . 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 ausführen, bis es beendet werden muss.

Nachdem die Dienste, die die Frühwarnung erhalten haben, geschlossen wurden, erhalten alle ProzesseSIGTERM einige Sekunden vor den SIGKILLAtomwaffen ein Signal .

Sie können ein Skript erstellen, das SIGTERM in den Ruhezustand versetzt und abschließt, um Ihren Befehl zu diesem Zeitpunkt auszuführen. Sie müssen sehen, ob dies in der Praxis genügend Zeit für die Ausführung der Befehle lässt. Dies vermeidet ein wenig Codierung, aber nicht viel - es ist im Allgemeinen besser, nur einen Daemon aus einem Shell-Skript zu erstellen.


Aus historischer Sicht - /sbin/rebootund Runlevels gab es unter Darwin / OS X nie und rc.shutdownsie werden zusammen mit dem Rest von rcjetzt, launchdder der Boss ist, veraltet . Möglicherweise können Sie rc.shutdown für Tiger oder früher verwenden (ich habe derzeit keines dieser Bilder zur Überprüfung bereit). Lion hat sicherlich alle Spuren von rc.d und init.d entfernt.

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.

bmike
quelle
Es stellt sich heraus, dass "veraltet" bedeutet "funktioniert nicht". :-(
Andrew J. Brehm
Ja - die Warnungen begannen bei Tiger und ich würde vermuten, dass sie mit Leopard verschwunden sind - es ist schwer, sich an all die Lion-Veränderungen zu erinnern, die um mein Gehirn herum laufen.
bmike
Dies macht die Sache wirklich komplizierter und macht Mac OS X zu einer sehr schlechten Serverplattform.
Andrew J. Brehm
launchd kann Skripte beim Herunterfahren vollständig ausführen. Vielleicht sollte ich die Geschichte herausarbeiten und diese Tatsache klarer lassen. Inwiefern schlägt launchd fehl, wenn Sie beim Herunterfahren ein Skript ausführen müssen?
bmike
Ich weiß nicht, wie ich beim Herunterfahren Launchd-Skripte ausführen soll. Ich benutze launchd, um Dinge beim Booten zu starten.
Andrew J. Brehm