11 votos

Ejecutar script al cerrar la sesión sin utilizar el gancho de cierre de sesión

He estado estudiando la posibilidad de ejecutar algunos comandos de limpieza cuando un usuario cierra la sesión, sin embargo, la antigua función de gancho de cierre de sesión, aunque todavía funciona, ha sido obsoleta desde hace algún tiempo, por lo que puede no estar con nosotros por mucho tiempo.

Lamentablemente, aunque launchd proporciona una alternativa conveniente a los hooks de inicio de sesión, no hay un reemplazo tan obvio para los hooks de cierre de sesión.

Ya he experimentado con la creación de un shell script que se lanza al iniciar la sesión, y simplemente duerme hasta que se recibe una señal de kill, sin embargo esto no parece funcionar (el scriptnunca recibe la señal durante el funcionamiento normal).

De lo contrario, no estoy seguro de cuál sería la mejor manera de ejecutar un comando rápido al cerrar la sesión. Sé que hay algunas utilidades de terceros que pueden hacerlo, pero ¿hay una forma "correcta" de hacerlo?

7voto

Haravikk Puntos 332

Parece que Apple no está interesada en un reemplazo del gancho de cierre de sesión, ya que cerraron mi tema preguntando por uno.

Sin embargo, una de las mejoras en Yosemite es que launchd ahora envía correctamente las señales a los shell scripts. Lo que esto significa es que ahora se puede hacer una tarea de cierre de sesión así:

Aquí hay un ejemplo de logout.sh:

#!/bin/sh
onLogout() {
    echo 'Logging out' >> ~/Logs/logout.sh.log
    exit
}

trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
    sleep 86400 &
    wait $!
done

Esto simplemente dormirá (de forma asíncrona, hacerlo de forma síncrona sin el ampersand no parece funcionar) hasta que reciba una de las señales atrapadas, momento en el que ejecutará el onLogout función.

Todo lo que tienes que hacer es lanzar ese script utilizando un RunAtLoad lanzar agente o lanzar demonio y se ejecutará al cerrar la sesión o al apagar, aunque es importante tener en cuenta que las tareas sólo tienen una cantidad limitada de tiempo para completar antes de que se maten en su lugar, por lo que esto no debe ser utilizado para ejecutar cualquier cosa que toma mucho tiempo, o requiere una conexión de red que podría retrasarse, etc.

Por supuesto, esto no es útil para nadie en Mavericks o anterior, pero bajo Yosemite esto ahora parece funcionar como se esperaba; así que en realidad lo estaba haciendo bien en primer lugar, launchd simplemente no estaba enviando las señales correctamente :)

NOTA: Para que esto funcione el shell scripts parece que tiene que ser ejecutado directamente por el lanzamiento, es decir, no debe ser invocado a través de sh . Así que si se coloca en ~/Library/Scripts/foo.sh los argumentos de tu programa podrían ser así:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>

2voto

uwotm8 Puntos 166

Puedes utilizar iHook para ejecutar los hooks de inicio y cierre de sesión, que he comprobado que siguen funcionando para los hooks de inicio y cierre de sesión no interactivos escritos en Bash y Python en Yosemite.

http://rsug.itd.umich.edu/software/ihook/

0voto

Si otros que llegan aquí desde los motores de búsqueda no se preocupan por usar un gancho de cierre de sesión, corre por ejemplo:

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

Entonces ~/.logouthook se ejecuta la próxima vez que se cierra la sesión.

El valor del LogoutHook tiene que ser una ruta de acceso a un ejecutable y no un comando del shell. La dirección defaults modifica el comando /var/root/Library/Preferences/com.apple.loginwindow.plist .

0voto

Trellis Puntos 109

Tampoco consigo que el elemento launchd de cierre de sesión funcione en 10.10.1, pero la clave LogoutHook en el "com.apple.loginwindow.plist" de Root funciona bien. ¿Hay algún otro ejemplo para el método launchd?

De todos modos, escribí un AppleScript para matar el volumen del sistema al cerrar la sesión para que el timbre de inicio no se escuche en el próximo inicio. Lo que no he resuelto son los detalles para gestionar múltiples comandos de cierre de sesión basados en una sola clave LogoutHook, o si es posible almacenar múltiples claves LogoutHook, por lo que todavía estoy interesado en el método Launchd, que podría ser gestionado con Lingon, o incluso Lingon 3, que tiene un alcance mucho más estrecho que el original (presumiblemente para existir en la tienda de aplicaciones).

set current\_Vol to (do shell script "osascript -e \\"output volume of (get volume settings)\\"")
if button returned of (display dialog "Do you want to silence the startup chime, restore it, or cancel?" buttons {"Silence", "Restore", "Cancel"} default button 1) is "silence" then
    do shell script "mkdir -p  /usr/local/logouttask;echo '#!/bin/bash
# logout script
osascript -e \\"set volume 0\\"' > /usr/local/logouttask/logoutscript;sudo defaults write com.apple.loginwindow LogoutHook /usr/local/logouttask/logoutscript;chmod +x /usr/local/logouttask/logoutscript" with administrator privileges
else
    try
        do shell script "sudo defaults write com.apple.loginwindow LogoutHook '';rm /usr/local/logouttask/logoutscript" with administrator privileges
        display dialog "The startup chime will be heard if the volume setting is greater than 0 at shut down or restart." buttons {"OK"} default button 1
    on error the error\_message number the error\_number
        if error\_number is 1 then
            display dialog "The script that sets system volume to zero at logout doesn't exist. The startup chime will be heard if the volume setting is greater than 0 at shut down or restart." buttons {"OK"} default button 1
        else
            display dialog "Error: " & the error\_number & ". " & the error\_message buttons {"OK"} default button 1
        end if
    end try
end if

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X