¿Cómo puedo hacer que Mac OS X ejecute un programa antes de apagarlo?

9

Estoy intentando que Mac OS X guarde todas mis máquinas virtuales de VirtualBox cuando se reinicie. Ya tengo un script que hace esto, pero necesito OS X para ejecutar este script automáticamente antes de reiniciar.

Cuando Mac OS X se reinicia, ¿ejecuta / sbin / reboot?

¿O de qué otra manera podría lograrse esto?

    
pregunta Andrew J. Brehm 05.07.2011 - 13:48

2 respuestas

5

Aunque Apple recomienda usar " launchd ", lo más fácil es crear un script de shell utilizando, por ejemplo, pico de Terminal:

pico /Users/Shared/logoutHook.sh

El archivo puede contener algo como:

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

Luego da los derechos de ejecución:

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

Finalmente, conecte el script al procedimiento de cierre de sesión:

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

Si inicia otra aplicación, ya que no he probado esto, creo que podría ser útil advertirme a mí y a usted que:

  • Es posible que tengamos que matar la señal de apagado para ejecutar lo que queremos;

  • Luego envíe uno nuevo (tenga cuidado de no matar la señal enviada por nuestro propio
    guión) ...

Si quieres quitar el gancho:

sudo defaults delete com.apple.loginwindow LogoutHook

Si usa " launchd ", la idea sería capturar la señal SIGTERM. Eche un vistazo a: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist

    
respondido por el llange 09.12.2013 - 17:33
4

Launchd envía una advertencia temprana de paradas a todos los scripts / daemons que tienen un subrutina StopService () . Esto le da a su proceso el mayor tiempo para limpiar.

Solo usa launchd para iniciar el script y haz que se ejecute en segundo plano hasta que sea el momento de salir.

Después de que los servicios que recibieron la alerta temprana se están cerrando, Todos los procesos obtienen una señal SIGTERM unos segundos antes de que SIGKILL los elimine.

Podrías hacer un script que duerma y atrape a SIGTERM para ejecutar tu comando cuando llegue ese momento. Tendrá que ver si eso permite suficiente tiempo en la práctica para que se ejecuten los comandos. Esto evita un poco de codificación, pero no mucho, por lo general es mejor hacer un demonio desde un script de shell.

Desde una perspectiva histórica: /sbin/reboot y los niveles de ejecución nunca existieron en Darwin / OS X y rc.shutdown está en desuso junto con el resto de rc ahora que launchd es el jefe. Es posible que puedas usar rc.shutdown en tiger o anterior (no tengo una de esas imágenes a la mano para verificar) Lion ciertamente ha eliminado todos los vestigios de rc.d y init.d.

Es posible que desee ver si sleepwatcher ayudaría en su caso. No lo he usado en mucho tiempo, pero ciertamente apunta a resolver tu dilema.

    
respondido por el bmike 16.07.2011 - 00:02

Lea otras preguntas en las etiquetas