Sauberes Herunterfahren/Neustart vom Terminal in 10.7+

Ich habe ein ferngesteuertes Headless-System, das ich automatisch herunterfahren/neu starten muss (ohne Verwendung von VNC oder lokaler Tastatur/Maus).

Verwenden Sie verschiedene Befehle über SSH oder über meinen Daemon wie erwartet und starten Sie den Computer neu:

sudo shutdown -r nowoderosascript -e 'tell application "System Events" to restart'

Diese Befehle führen jedoch dazu, dass das Betriebssystem Fenster aller laufenden Anwendungen erneut öffnet, obwohl Folgendes zutrifft:

  • Beim normalen Abmelden Reopen windows when logging back inist das Häkchen entfernt
  • Nur der Artikel, den ich mit dem Login beginnen möchte, ist in aufgelistet System Preferences > Users & Groups > Login Items.
  • defaults write -g ApplePersistence -bool noeingestellt ist
  • System Preferences > General > Ask to keep changes when closing documentsaktiviert oder deaktiviert ist
  • System Preferences > General > Close windows when quitting an appaktiviert oder deaktiviert ist
  • Recent Itemsist auf einen beliebigen Wert gesetzt (hat keine Wirkung)
  • ~/Library/Preferences/com.apple.loginwindow.plistenthält auf NEINTALLogoutSavesSate gesetzt

In meinem Fall kann ich das Applescript nicht verwenden, da 10.7+ (?) Warnt, wenn ein anderer Computer im Netzwerk mit AFP oder SMBed geteilt wird, wodurch das Herunterfahren fehlschlägt. Der shutdownBefehl erzwingt den Neustart, ohne einen Dialog zu öffnen, der genau das ist, was ich brauche. Wenn die Maschine jedoch hochfährt, möchte ich, dass genau eine Anwendung bei der Anmeldung gestartet wird, und sie wird in den Anmeldeelementen aufgeführt.

Der Computer ist so eingestellt, dass er sich automatisch anmeldet, damit diese Anwendung ausgeführt werden kann. Wenn jedoch andere Fenster geöffnet waren (Terminal oder TextEdit mit nicht gespeicherten Änderungen), möchte ich, dass mein Skript zum Herunterfahren / Neustarten das Schließen aller geöffneten Anwendungen ohne Speichern erzwingt und beim nächsten Anmelden NICHT öffnet . Ich würde auch lieber nicht alle Benutzerprozesse durchlaufen, die jedes a SIGTERModer SIGKILLmanuell senden, bevor ich den shutdownBefehl sende.

Mir ist völlig bewusst, dass dies zu Datenverlust führen kann (wenn der Benutzer sein Dokument nicht gespeichert hat), aber dies ist normalerweise ein unbeaufsichtigter Computer, den ich neu starten möchte, um den Computer in einen bekannten Zustand zu versetzen, nicht in den Zustand, in dem er gelassen wurde.

AFAICT, keines davon funktioniert, um die Maschine in 3.7+ sauber herunterzufahren / neu zu starten.

Antworten (1)

Beim Schreiben dieser Frage habe ich eine Entdeckung gemacht, die anderen helfen könnte, dieses Problem fast vollständig zu lösen:

  • ~/Library/Preferences/com.apple.loginwindow.plistenthält auf NEINTALLogoutSavesSate gesetzt

Dies ist zwar richtig, aber es gibt eine andere Datei, ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plistdie sich unter befindet und ein Array namens TALAppsToRelaunchAtLogin. Dieses Array enthält eine Liste der derzeit geöffneten App-Fenster.

Das Löschen dieses Arrays oder, auf eine unverblümtere Weise, der gesamten Datei und das sofortige Neustarten hat das Problem fast vollständig behoben.

Das verbleibende Problem besteht darin, dass beim Starten des Computers alle geöffneten Finder-Fenster wiederhergestellt werden und wenn Sie ein oder mehrere Terminalfenster hatten und tatsächlich den Befehl zum Herunterfahren von diesem Fenster aus ausgeführt haben, wird es wiederhergestellt, wenn Terminal erneut gestartet wird, jedoch über SSH oder a Dämon scheint gut zu funktionieren.

Ich denke nicht wirklich, dass dies auf lange Sicht eine geeignete Lösung ist, aber bisher scheint es in meinen kleinen Tests zu funktionieren.

Nach weiteren Recherchen scheint es, dass Sie ein Skript in die Anmeldung einbinden können, sodass die Datei immer gelöscht wird: Standardwerte schreiben com.apple.loginwindow LoginHook /usr/bin/loginfix.sh

:edit, ähnlich wie im Terminalfenster sieht es so aus, als würde jede einzelne App ihren Zustand speichern. Wenn Sie also beispielsweise TextEdit öffnen, nehmen Sie einige Änderungen vor und starten Sie den Computer mit der obigen Methode neu, wenn Sie sich wieder anmelden und starten TextEdit Sie landen mit dem Dokument, das Sie geöffnet hatten. Ein Blick hinein ~/Library/Containers/com.apple.TextEditerklärt alles