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

13

Todos sabemos que Mac OS X tiene la funcionalidad muy útil de Elementos de inicio de sesión que le permite, entre otras cosas, configurar aplicaciones / scripts 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", si lo desea.
Básicamente, quiero escribir algunas pequeñas secuencias de comandos de limpieza para mí que se ejecutarán automáticamente cuando cierre sesión o cierre.

Entonces, estoy buscando una manera de tener un script (o, idealmente, una lista de ellos) que se active automáticamente cuando cierre sesión. El cierre de sesión esperará a que finalicen las secuencias de comandos (al igual que la forma en 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 (a) script (s) cuando salgo de Mac OS X?

Nathan Greenstein
fuente

Respuestas:

7

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 enlace 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 sesión de manera confiable con launchd. Cuando intenté capturar señales como EXIT, el código en la trampa solo se ejecutó cuando cerré la 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>
Lri
fuente
Hmm, ninguno de esos ha funcionado para mí. Tengo este script , que funciona si lo ejecuto con 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!
Nathan Greenstein
No estoy seguro de si estoy haciendo algo mal o no. Estoy en 10.6.8 y LogoutHook no funciona. Te agradecería si pudieras echar un vistazo a esta captura de pantalla y avisarme si algo parece estar mal. ¡Gracias!
Nathan Greenstein
1
Ah! Ese último hizo el truco en 10.6.8. ¡Gracias! Sin embargo, una nota: no funciona con Lion :(
Nathan Greenstein
2
Ambos métodos funcionan bien en mi máquina Mountain Lion (10.8.2), incluso al apagar o reiniciar. Tenga en cuenta que los enganches de LoginHook / LogoutHook se ejecutan en el contexto del usuario raíz , y que son enganches individuales para todo el sistema , y que el enganche de inicio de sesión se ejecuta sincrónicamente , mucho antes que los agentes de lanzamiento por usuario; de manera similar, el enlace 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 que solo funcionan los ganchos; por ejemplo, si desea silenciar el sonido al apagar para suprimir el sonido de inicio de Mac, solo LogoutHook funciona de manera confiable.
mklement0
1

En realidad hay una manera:

  1. Abra la aplicación "Script Editor"
  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>
filippo
fuente
Me gusta esto. Simple y adecuado para mis necesidades. Y no en desuso.
Ivan X
0

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

Acción disparada

Hay dos cosas que debe tener en cuenta sobre Script Timer. Uno, es no libre. 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 hayan hecho compatible.

daviesgeek
fuente
1
Esto está en desuso ahora
Kirtikumar A.
0

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

svth
fuente
0

Power Manager puede ejecutar un script cuando un usuario cierra 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 tarea Asistente de programación

Se necesitaban versiones anteriores con el editor de eventos , pero ahora se incluye una tarea del Asistente de programación para ejecutar scripts al iniciar y cerrar sesión.

Escribí Power Manager, así que siéntase libre de hacer preguntas técnicas sobre su implementación. En el caso de eventos desencadenados de 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 de bucle / sondeo.

Graham Miln
fuente