Tengo un sistema sin cabeza que se controla de forma remota y necesito apagar/reiniciar de forma automática (sin el uso de VNC o teclado/ratón local).
Usar varios comandos a través de SSH o a través de mi daemon funciona como se esperaba y reinicia la máquina:
sudo shutdown -r now
oosascript -e 'tell application "System Events" to restart'
Sin embargo, estos comandos hacen que el sistema operativo vuelva a abrir las ventanas de cualquier aplicación en ejecución, aunque lo siguiente sea cierto:
Reopen windows when logging back in
está marcadoSystem Preferences > Users & Groups > Login Items
.defaults write -g ApplePersistence -bool no
Está establecidoSystem Preferences > General > Ask to keep changes when closing documents
está marcado o desmarcadoSystem Preferences > General > Close windows when quitting an app
está marcado o desmarcadoRecent Items
se establece en cualquier valor (no tiene efecto)~/Library/Preferences/com.apple.loginwindow.plist
contiene TALLogoutSavesSate
establecido en NOEn mi caso, en realidad no puedo usar el applescript ya que 10.7+(?) advierte cuando otra máquina se comparte en red con AFP o SMB, lo que hace que falle el apagado. El shutdown
comando fuerza el reinicio sin que aparezca un cuadro de diálogo que es exactamente lo que necesito. Sin embargo, cuando la máquina se inicia, quiero que se inicie exactamente una aplicación al iniciar sesión, y aparece en Elementos de inicio de sesión.
La máquina está configurada para iniciar sesión automáticamente para que esta aplicación pueda ejecutarse, pero si alguna otra ventana estuviera abierta (Terminal o TextEdit con cambios no guardados) quiero que mi secuencia de comandos de apagado/reinicio fuerce el cierre de cualquier aplicación abierta sin guardar y NO abrir en el próximo inicio de sesión . También preferiría no realizar un ciclo for-loop a través de todos los procesos de usuario que envían cada a SIGTERM
o SIGKILL
manualmente antes de enviar el shutdown
comando.
Soy plenamente consciente de que esto puede causar la pérdida de datos (si el usuario no guardó su documento), pero normalmente se trata de una máquina desatendida que quiero reiniciar para llevar la máquina a un estado conocido, no al estado en el que se quedó.
AFAICT ninguno de estos funciona para apagar/reiniciar limpiamente la máquina en 3.7+.
Mientras escribía esta pregunta, hice un descubrimiento que podría ayudar a otros a resolver este problema casi por completo:
~/Library/Preferences/com.apple.loginwindow.plist
contieneTALLogoutSavesSate
establecido en NO
Si bien esto es cierto, hay otro archivo ubicado en ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plist
que contiene una matriz llamada TALAppsToRelaunchAtLogin
. Esa matriz contiene una lista de ventanas de aplicaciones actualmente abiertas.
Eliminar esta matriz, o de una manera más contundente todo el archivo, y reiniciar inmediatamente solucionó el problema casi por completo.
El problema restante es cuando la máquina se inicia, se restauran todas las ventanas abiertas del Finder y si tenía una o más ventanas de terminal y realmente ejecutó el comando de apagado desde esa ventana, hace que se restaure cuando Terminal se inicia nuevamente, pero a través de SSH o un Daemon parece funcionar bien.
Realmente no creo que esta sea una solución adecuada a largo plazo, pero hasta ahora, en mis pequeñas pruebas, parece funcionar.
después de una mayor investigación, parece que puede conectar un script al inicio de sesión para que siempre elimine el archivo: los valores predeterminados escriben com.apple.loginwindow LoginHook /usr/bin/loginfix.sh
: editar, en la misma línea que la ventana del terminal, parece que cada aplicación individual está guardando su estado, por lo que, por ejemplo, si abre TextEdit, realice algunos cambios y luego reinicie la máquina usando el método anterior cuando vuelva a iniciar sesión y comience TextEdit terminas con el documento que tenías abierto. Mirar adentro ~/Library/Containers/com.apple.TextEdit
lo explica todo