Limpiar apagado/reinicio desde terminal en 10.7+

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 nowoosascript -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:

  • Cuando cerrar sesión normalmente no Reopen windows when logging back inestá marcado
  • Solo el elemento que quiero iniciar con el inicio de sesión aparece en System Preferences > Users & Groups > Login Items.
  • defaults write -g ApplePersistence -bool noEstá establecido
  • System Preferences > General > Ask to keep changes when closing documentsestá marcado o desmarcado
  • System Preferences > General > Close windows when quitting an appestá marcado o desmarcado
  • Recent Itemsse establece en cualquier valor (no tiene efecto)
  • ~/Library/Preferences/com.apple.loginwindow.plistcontiene TALLogoutSavesSateestablecido en NO

En 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 shutdowncomando 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 SIGTERMo SIGKILLmanualmente antes de enviar el shutdowncomando.

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+.

Respuestas (1)

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.plistcontiene TALLogoutSavesSateestablecido en NO

Si bien esto es cierto, hay otro archivo ubicado en ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plistque 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.TextEditlo explica todo