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

9

He estado buscando ejecutar algunos comandos de limpieza cuando un usuario cierra la sesión, sin embargo, la antigua función de enganche de cierre de sesión, aunque sigue funcionando, está obsoleta desde hace algún tiempo, por lo que es posible que no esté con nosotros por mucho tiempo.

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

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

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

    
pregunta Haravikk 05.10.2014 - 13:14

4 respuestas

7

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

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

Aquí hay un ejemplo 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 se desactivará (de forma asíncrona, hacerlo de forma sincrónica sin que parezca que no funciona) hasta que reciba una de las señales atrapadas, momento en el que ejecutará la función onLogout .

Todo lo que necesita hacer es iniciar ese script con un agente de lanzamiento RunAtLoad o un daemon de lanzamiento y se ejecutará al cerrar o cerrar sesión, aunque es importante tener en cuenta que las tareas solo tienen una cantidad limitada de tiempo para complete antes de eliminarlos, por lo que no debe usarse para ejecutar nada que tarde mucho tiempo o que requiera una conexión de red que pueda retrasarse, etc.

Por supuesto, esto no sirve para nadie en Mavericks o antes, pero bajo Yosemite 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, los scripts de shell deben ejecutarse directamente mediante el inicio, es decir, no deben invocarse a través de sh . Por lo tanto, si se colocara en ~/Library/Scripts/foo.sh , los argumentos de su programa podrían ser:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
    
respondido por el Haravikk 19.10.2014 - 16:07
2

Puedes usar iHook para ejecutar enganches de inicio / cierre de sesión, que he encontrado que todavía funcionan para los enganches de inicio de sesión y cierre de sesión no interactivos escritos en Bash y Python en Yosemite.

enlace

    
respondido por el user79406 21.10.2014 - 19:24
0

Si a otras personas que llegan desde los motores de búsqueda no les importa usar un gancho de cierre de sesión, ejecute, por ejemplo:

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

Luego, ~/.logouthook se ejecuta la próxima vez que cierre sesión.

El valor de la clave LogoutHook tiene que ser una ruta a un ejecutable y no un comando de shell. El comando defaults modifica /var/root/Library/Preferences/com.apple.loginwindow.plist .

    
respondido por el user495470 06.10.2014 - 13:46
0

Tampoco puedo hacer que el elemento de inicio de sesión launchd funcione en 10.10.1, pero la clave LogoutHook en "com.apple.loginwindow.plist" de la raíz funciona bien. ¿Hay otros ejemplos para el método launchd?

De todos modos, escribí un AppleScript para eliminar 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 averiguado son los detalles para administrar varios comandos de cierre de sesión basados en una sola tecla 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 administrarse con Lingon. o incluso Lingon 3, que tiene un alcance mucho más estrecho que el original (probablemente existe 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
    
respondido por el Trellis 27.01.2015 - 21:21

Lea otras preguntas en las etiquetas