¿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 reinicia. 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, ¿se ejecuta / sbin / reboot?

¿O de qué otra forma se podría lograr esto?



Eso no es un duplicado. No quiero saber cómo ejecutar un script o programa al cerrar sesión. Quiero saber cómo ejecutar un script o programa al cerrar.
Andrew J. Brehm

1
Tienes razón. No es un duplicado exacto. La respuesta en la pregunta vinculada aconseja al usuario que coloque su script /etc/rc.shutdown.localpara ejecutarlo al cerrar. Parece que eso es lo que estás buscando.
michaelmichael


El método rc.shutdown.local no funciona.
Andrew J. Brehm

Respuestas:


5

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

pico /Users/Shared/logoutHook.sh

El archivo puede contener algo como:

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

Luego otorgue derechos de ejecución:

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

Finalmente, enganche 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, como no lo he probado, creo que podría ser útil advertirme a usted y a usted que:

  • Es posible que debamos eliminar la señal de apagado para ejecutar lo que queramos;

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


Si quieres quitar el gancho:

sudo defaults delete com.apple.loginwindow LogoutHook

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


4

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

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

Después de que los servicios que recibieron la alerta temprana se están cerrando, todos los procesos reciben una SIGTERMseñal unos segundos antes de que los SIGKILLdestruyan.

Puede crear un script que duerma y atrape a SIGTERM para ejecutar su comando cuando llegue el 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; en general, es mejor hacer un demonio con un script de shell.


Desde una perspectiva histórica, /sbin/rebooty los niveles de ejecución nunca existieron en Darwin / OS X y rc.shutdownestá en desuso junto con el resto de rcahora que launchdes el jefe. Es posible que pueda usar rc.shutdown en Tiger o anterior (no tengo una de esas imágenes a mano para verificar en este momento) Lion ciertamente ha eliminado todos los vestigios de rc.d e init.d.

Es posible que desee ver si Sleepwatcher ayudaría en su caso. No lo he usado en mucho tiempo, pero ciertamente tiene como objetivo resolver su dilema.


Resulta que "en desuso" significa "no funciona". :-(
Andrew J. Brehm

Sí, las advertencias comenzaron en Tiger y supongo que desaparecieron con Leopard, es difícil de recordar con todos los cambios de Lion corriendo por mi cerebro.
bmike

Esto realmente complica las cosas y hace que Mac OS X sea una plataforma de servidor muy mala.
Andrew J. Brehm

launchd es totalmente capaz de ejecutar scripts en el apagado. Quizás debería editar la historia y dejar ese hecho más claro. ¿De qué manera launchd falla su necesidad de ejecutar un script en el apagado?
bmike

No sé cómo hacer que launchd ejecute scripts en el apagado. Yo uso launchd para comenzar las cosas en el arranque.
Andrew J. Brehm
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.