¿Es posible ejecutar scripts en suspensión y activación?

MacBook Pro 2010 con OS X Lion.

¿Es posible ejecutar scripts en eventos de suspensión y activación?

Mi aplicación específica es que tengo volúmenes Truecrypt sincronizados con Dropbox que uso regularmente tanto en mi MacBook como en mi iMac. Rara vez apago mi MBP ya que cerrar la tapa es mucho más rápido y fácil, pero esto significa que debo acordarme de desmontar mis volúmenes de Truecrypt y dejar que se sincronicen antes de cerrar mi MBP. Es bastante trivial montar/desmontar scripts de ellos, pero me gustaría ir un paso más allá y hacer que estos scripts se ejecuten automáticamente.

Respuestas (8)

Parece que a medida que se envía el sistema operativo, dormir/activar no puede activar scripts , pero se han desarrollado soluciones de terceros.

No tengo experiencia personal con estos programas o sus proveedores.

El escenario parece hacer lo que estoy buscando. ¡Gracias!
Hice que Scenario disparara el applescript que dispara un script bash y listo.
Para finalizar una aplicación, simplemente escriba esto en una nueva ventana de AppleScrip y guárdelo en la carpeta SleepScripts: dígale a la aplicación "CodeBox" quit end dígale

SleepWatcher puede ser útil.

De la descripción: se puede usar para ejecutar un comando de Unix cuando la Mac o la pantalla de la Mac pasan al modo de suspensión o se activan, después de un tiempo determinado sin interacción del usuario o cuando el usuario reanuda la actividad después de un descanso o cuando la energía El suministro de una computadora portátil Mac está conectado o desconectado. También puede enviar la Mac al modo de suspensión o recuperar el tiempo transcurrido desde la última actividad del usuario.

Está funcionando bien para mí en 10.6.8. Varias versiones están disponibles para soportar 10.1(!) a 10.7

Aquí hay un montón de sugerencias de Mac OSX que usan SleepWatcher.
Puede instalar SleepWatcher de Homebrew , p brew install sleepwatcher. Y mira este post , es muy útil. La utilidad SleepWatcher también es compatible con OS X El Capitan (10.11).

Esta es mi propia aplicación, así que considéralo, pero ControlPlane tiene la capacidad de realizar acciones basadas en Sleep/Wake. Lo encontrará en http://www.controlplaneapp.com/ .

ControlPlane es una bifurcación de MarcoPolo y se actualizó para ejecutarse en Snow Leopard y Lion.

Utilidad de sonido muy genial, es exagerado solo por esto, pero si necesita activar algo más que despertar/dormir, entonces suena bastante bien. También me gusta el soporte de Growl para que sepas lo que está haciendo. Y es gratis :).
Debería ser la respuesta aceptada porque es gratis.
¿Se puede utilizar para montar y desmontar unidades con suspensión y activación? ¿Necesitamos escribir scripts de automatización?
Años más tarde, el plano de control ya no recibe mantenimiento debido a la acumulación de incompatibilidades que Dustin publicó en su blog y que no tuvo tiempo de solucionar. Lástima, aunque tiene sentido.

Desarrollé el siguiente Launch Daemon simple para proporcionar un disparador de 'activación' para scripts en Leopard:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>wake-alert</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>z=/tmp/wake; test -s $z || { date > $z; say w; }; 
tail -1 /Library/Logs/DirectoryService/DirectoryService.server.log | grep -v Sleep || > $z
        </string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Logs/DirectoryService/DirectoryService.server.log</string>
    </array>
    <key>ExitTimeOut</key>
    <integer>2</integer>
    <key>ThrottleInterval</key>
    <integer>1</integer>
</dict>
</plist>

Puede reemplazar 'say w' con su código. Escribo una fecha en z, pero puedes cambiar esto para escribir cualquier cosa. Es posible que deba aumentar 'ExitTimeOut' para algunos scripts. Mi Launch Daemon reside en /Library/LaunchDaemons/wake-alert.plist

Launch Daemon observa DirectoryService.server.log y escribe en un archivo temporal siempre que el archivo esté vacío. El archivo se borra con una entrada de registro de 'Suspender' y con Apagar.

Si usa 'cambio rápido de usuario' para dormir, encontrará que los scripts que requieren que un usuario haya iniciado sesión intentarán ejecutarse demasiado pronto y fallarán a menos que modifique el Launch Daemon, tal vez grep 'Succeeded' en 'secure.log'.

/Library/Logs/DirectoryService/DirectoryService.server.logno existe en High Sierra (10.13).
Probablemente hay otros registros que se pueden utilizar.

Estaba interesado en esa pregunta anteriormente pero no encontré ninguna guía paso a paso sobre cómo lograrlo. La solución se basa en una herramienta de código abierto llamada sleepwatcher y apple launchd Fue inspirado por este artículo

¡Así que Disfrutá! :

  1. Instalar el vigilante del sueño =>brew install sleepwatcher
  2. Al principio crea => ~/.wakeupy ~/.sleepscripts y pon algo de lógica de shell en ellos
  3. Agregue los permisos necesarios =>chmod 700 ~/.sleep && chmod 700 ~/.wakeup
  4. Pruébelo localmente => /usr/local/sbin/sleepwatcher --verbose --sleep ~/.sleep- vaya a dormir con la terminal en ejecución
  5. Si funciona, cargue el proceso como agente de lanzamiento para todos los usuarios =>/Library/LaunchAgents
  6. Agregar enlace simbólico para la tarea de lanzamiento de Sleepwatcher =>sudo ln -sfv /usr/local/Cellar/sleepwatcher/2.2/de.bernhard-baehr.sleepwatcher-20compatibility.plist /Library/LaunchAgents/
  7. Cargar tarea de lanzamiento =>sudo launchctl load /Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility.plist

Espero que ayude a alguien :)

sleepwatcher no me funciona en calalina con un disco SSD interno. Supongo que el SSD es tan rápido que la computadora duerme antes de que se pueda ejecutar el script.
No parece funcionar en mí. Estoy en Catalina y simplemente corriendo /usr/local/sbin/sleepwatcher --verbose --sleep ~/.sleepcuelga.
@ user3056783 Creo que en realidad funciona como debería colgarse si lo está ejecutando en la terminal. Es por eso que debe ejecutarse como un proceso daemon a través de LaunchAgents, como mencioné en pasos posteriores.
¡esto SÍ funciona para mí en Catalina! Solo puedes hacer brew install sleepwatcherpara conseguirlo. ¡Gracias!
para mí esto funcionó: brew services start sleepwatcher; sudo cp /usr/local/Cellar/sleepwatcher/2.2.1/etc/sleepwatcher/rc.* /etcy luego agregar el ~/.sleeparchivo.

Uso Keyboard Maestro ( https://www.keyboardmaestro.com/ ), sin afiliación. Puede desencadenar una acción cuando el sistema entra en modo de suspensión o se activa entre toneladas de otras funciones para facilitar el trabajo con Mac.

ingrese la descripción de la imagen aquí

Usé los eventos de reposo/activación para activar una URL que se conecta a un dispositivo IOT que diseñé para controlar un ventilador externo que puse encima de la Mac Mini (la Mac está al revés).

ingrese la descripción de la imagen aquí

Otro programa que puede descubrir y tener la tentación de probar es EventScripts . Aunque es un programa muy impresionante que recomendaría en general, después de probarlo para este propósito, en realidad NO parece ser capaz de activar scripts lo suficientemente rápido como para que se ejecuten antes de que su Mac se duerma, y ​​en su lugar, el script de suspensión lo hará. no se ejecute hasta después de que la Mac se haya despertado, lo que (obviamente) anula el propósito.

Espero ahorrarle a usted y a cualquier otra persona que lea esto las horas de prueba que me tomó llegar a esta conclusión. Lamento tener que decir que falló, sin embargo, porque en muchos aspectos es un programa muy bien diseñado y bastante potente y flexible. También es bastante económico ($3). Sin embargo, el rendimiento de bajo nivel simplemente no parece estar allí para ejecutar un script antes de dormir.

Por otro lado, en mis pruebas (hasta ahora) , Sleepwatcher parece ser bastante confiable y rápido. También es gratis, lo cual es increíble. Seguiré probando y, si encuentro que no funciona, a veces actualizaré mi respuesta y seguiré probando otras opciones.

ACTUALIZAR No heencontrado que sleepwatcher sea consistentemente confiable desde que originalmente escribí esta respuesta, aunque inicialmente parecía estar funcionando. En mi caso, no necesito ejecutar scripts arbitrarios, sino simplemente expulsar unidades externas. He encontrado una aplicación pequeña y económica que hace esto muy bien hasta ahora: Jettison . Esto se ha convertido rápidamente en una de las pocas utilidades sin las que no puedo vivir. Si sus necesidades son las mismas que las mías, creo que encontrará que vale la pena los pocos dólares que cobran.

WakeWatcher es una sencilla aplicación en segundo plano sin rostro para OS X que creé para abordar este problema. Se ejecuta ~/.onwakecada vez que se detecta una estela. Luego puede poner los comandos para montar/volver a montar sus unidades en ese script.

WakeWatcher es adecuado para su uso como elemento de inicio de sesión. No es muy sofisticado, pero es gratuito y sencillo.

Ejecutar secuencias de comandos en suspensión sería una simple adición, pero me preocupa el tiempo disponible para que las secuencias de comandos se completen antes de que el sistema entre en suspensión. Si realmente lo necesita, abra un problema en el proyecto github y lo agregaré.