Hacer que un script/aplicación se ejecute al cerrar la sesión

Todos sabemos que Mac OS X tiene la muy útil funcionalidad Elementos de inicio de sesión que le permite, entre otras cosas, configurar aplicaciones/secuencias de comandos para que se ejecuten cuando inicie sesión.

Estoy buscando una manera de configurar una lista de scripts/aplicaciones que se ejecutan cuando me desconecto . Una lista de "Elementos de cierre de sesión", por así decirlo.
Básicamente, quiero escribir algunos pequeños scripts de limpieza para mí que se ejecutarán automáticamente cuando cierre la sesión o cierre la sesión.

Por lo tanto, estoy buscando una forma de que un script (o, idealmente, una lista de ellos) se active automáticamente cuando cierre la sesión. El cierre de sesión esperaría a que finalicen los scripts (al igual que el cierre de sesión espera que haga clic en Guardar si una aplicación lo solicita).

¿Hay alguna manera de activar automáticamente (un) script(s) cuando me desconecto de Mac OS X?

Respuestas (5)

Los ganchos de cierre de sesión quedaron obsoletos en 10.4 , pero aún funcionan a partir de 10.9.

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nsay a' > ~/.logouthook
chmod +x ~/.logouthook

El valor de la clave LogoutHook solo puede ser una ruta a un ejecutable y no un comando de shell. El gancho de cierre de sesión se ejecuta como root.

El comando predeterminado modifica /var/root/Library/Preferences/com.apple.loginwindow.plist. Agregar una clave LogoutHook a /Library/Preferences/com.apple.loginwindow.plist no funciona.

Si un enlace de cierre de sesión tarda lo suficiente en ejecutarse, se muestra una pantalla gris hasta que finaliza el enlace de cierre de sesión. No parece haber ningún límite de tiempo después del cual los ganchos de cierre de sesión se vean obligados a terminar.

No he descubierto ninguna forma de ejecutar programas al cerrar la sesión de manera confiable con launchd. Cuando intenté atrapar señales como EXIT, el código en la trampa solo se ejecutó cuando cerré sesión en la ventana de inicio de sesión y no cuando apagué o reinicié.

<?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>test</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-c</string>
    <string>trap 'echo a>/Users/username/Desktop/a;say a' EXIT;while :;do sleep 10;done</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
Hmm, ninguno de los dos me ha funcionado. Tengo este script , que funciona si lo ejecuto sh(crea ese archivo .txt). Guardé el script como /etc/rc.shutdown.local y lo agregué defaultscomo dijiste. Ninguno de los dos archivos ya estaba allí. ¿Estoy haciendo algo mal? ¡Gracias!
No estoy seguro si estoy haciendo algo mal o no. Estoy en 10.6.8 y LogoutHook no funciona. Le agradecería si pudiera echar un vistazo a esta captura de pantalla y me hiciera saber si algo se ve mal. ¡Gracias!
¡Ay! Ese último funcionó en 10.6.8. ¡Gracias! Sin embargo, una nota: no funciona con Lion :(
Ambos métodos funcionan bien en mi máquina Mountain Lion (10.8.2), incluso cuando se apaga o se reinicia. Tenga en cuenta que los ganchos LoginHook/LogoutHook se ejecutan en el contexto del usuario raíz , y que son ganchos únicos para todo el sistema , y ​​que el gancho de inicio de sesión se ejecuta sincrónicamente , mucho antes que los agentes de inicio por usuario; De manera similar, el gancho de cierre de sesión se ejecuta antes que un agente de inicio por usuario que usa el método EXIT-trap. Hay casos en los que solo funcionan los anzuelos; por ejemplo, si desea silenciar el sonido al apagar para suprimir el sonido de inicio de la Mac, solo LogoutHook funciona de manera confiable.

En realidad, hay una forma no obsoleta de hacerlo:

  1. Abra la aplicación "Editor de secuencias de comandos"
  2. Pegar
    do shell script "PUT YOUR START SCRIPT PATH HERE"
    
    on quit
        do shell script "PUT YOUR STOP SCRIPT PATH HERE"
        continue quit
    end quit
  1. Archivo > Guardar, Seleccionar aplicación y Permanecer abierto después de ejecutar el controlador y Guardar
  2. Preferencias del sistema > Usuarios y grupos > pestaña Elementos de inicio de sesión > botón +
  3. Agregue la aplicación y márquela como Oculta

Para ocultarlo del Dock:

  1. Haga clic derecho en la aplicación y seleccione Mostrar contenido del paquete
  2. Abra Info.plist y agregue
<key>NSUIElement</key>
<string>1</string>
Me encanta esto. Sencillo y adecuado para mis necesidades. Y no en desuso.

Script Timer es una buena opción para esto. Puede ejecutarse al cerrar sesión, iniciar sesión y mucho más. Iría con esto para una solución simple y fácil de usar. Tiene una GUI simple:

Acción desencadenada

Hay dos cosas que debe tener en cuenta sobre Script Timer. Uno, no es gratis . Cuesta $12, pero personalmente creo que vale la pena. Dos, no es totalmente compatible con Lion, pero han prometido una actualización gratuita tan pronto como lo hagan compatible.

Esto está obsoleto ahora

También puede crear una aplicación para Mac a partir de su secuencia de comandos usando algo como Platypus y luego agregarlo a Elementos de inicio de sesión como cualquier otra aplicación.

Power Manager puede ejecutar un script cuando un usuario cierra la sesión. Este es un producto comercial y es compatible con la última versión de macOS.

Power Manager ejecuta un script al cerrar la sesión Tarea del asistente de programación

Las versiones anteriores requerían el uso del editor de eventos , pero ahora se incluye una tarea del asistente de programación para ejecutar secuencias de comandos al iniciar y cerrar sesión.

Escribí Power Manager, así que no dude en hacer preguntas técnicas sobre su implementación. En el caso de eventos activados por cierre de sesión, Power Manager no sondea los cambios en el estado del usuario, sino que macOS le notifica los cambios del usuario. Este enfoque es más eficiente que tener un script en bucle/sondeo.