Pulizia spegnimento / riavvio dal terminal in 10.7+

Ho un sistema senza testa che viene controllato da remoto che ho bisogno di spegnere / riavviare in modo automatico (senza l'uso di VNC o tastiera locale / mouse).

L'utilizzo di diversi comandi tramite SSH o tramite il mio demone funziona come previsto e riavvia la macchina:

sudo shutdown -r now o osascript -e 'tell application "System Events" to restart'

Tuttavia, questi comandi causano che il sistema operativo riapri le windows delle applicazioni in esecuzione anche se le seguenti sono tutte vere:

  • Quando si esegue normalmente la Reopen windows when logging back in non è selezionata
  • Solo l'elemento che voglio iniziare con il login è elencato in System Preferences > Users & Groups > Login Items .
  • defaults write -g ApplePersistence -bool no è impostato
  • System Preferences > General > Ask to keep changes when closing documents è selezionata o non selezionata
  • System Preferences > General > Close windows when quitting an app è selezionata o non selezionata
  • Recent Items sono impostati su qualsiasi valore (non ha alcun effetto)
  • ~/Library/Preferences/com.apple.loginwindow.plist contiene TALLogoutSavesSate impostato su NO

Nel mio caso non posso usare effettivamente il applescript poiché 10.7+ (?) Avverte quando un'altra macchina è condivisa da networking con AFP o SMBed, causando che l'arresto non sia riuscito. Il command shutdown obbliga il riavvio senza sfogliare una window di dialogo che è esattamente quello di cui ho bisogno. Tuttavia, quando la macchina si avvia, voglio esattamente un'applicazione per iniziare al login, ed è elencato negli elementi di accesso.

La macchina è impostata per accedere automaticamente in modo che questa applicazione possa essere eseguita ma se sono state aperte altre windows (Terminale o TextEdit con modifiche non salvate) desidera che il mio script di arresto / riavvio imponga chiudere tutte le applicazioni aperte senza salvare e NON aprire il login successivo. Inoltre non preferirei for-loop attraverso tutti i processi utente inviando ciascuno un SIGTERM o SIGKILL manualmente prima di submit il command di shutdown .

Sono pienamente consapevole che ciò può causare la perdita di dati (se l'utente non ha salvato il proprio documento), ma questo è in genere una macchina incustodita che voglio riavviare per portre la macchina in uno stato noto e non nello stato in cui è stato lasciato.

AFAICT nessuno di questi funziona per spegnere e riavviare la macchina in 3.7+.

Mentre scrissi questa domanda ho fatto una scoperta che potrebbe aiutare gli altri a risolvere quasi completamente questo problema:

  • ~/Library/Preferences/com.apple.loginwindow.plist contiene TALLogoutSavesSate impostato su NO

Anche se questo è vero, c'è un altro file situato in ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plist che contiene un arrays chiamato TALAppsToRelaunchAtLogin . Quella matrix contiene un elenco di windows app aperte attualmente.

Eliminando questo arrays, o in modo più scioccato, il file integer e immediatamente riavviato risolvono quasi completamente il problema.

Il problema rimanente è quando la macchina viene avviata, tutte le windows di Finder aperte vengono ripristinate e se si dispone di una o più windows di terminal e effettivamente eseguito il command di arresto da quella window, esso provoca la ripristino quando il Terminal viene avviato nuovamente, ma tramite SSH o un il demone sembra funzionare bene.

Non credo proprio che questa sia una soluzione adeguata a lungo termine ma finora nei miei piccoli test sembra funzionare.

su ulteriori ricerche sembra che tu possa agganciare uno script al login in modo da eliminare sempre il file: default write com.apple.loginwindow LoginHook /usr/bin/loginfix.sh

: modifica, seguendo le stesse righe della window del terminal, sembra che each singola applicazione sia in grado di risparmiare lo stato, per esempio se si apre TextEdit, apportre alcune modifiche e riavviare la macchina usando il metodo sopra riportto quando si riconnette e inizia TextEdit si conclude con il documento che hai aperto. Guardando in ~/Library/Containers/com.apple.TextEdit spiega tutto