10 votos

Ejecutar secuencias de Comandos de cierre de sesión Sin el Uso del Gancho de cierre de sesión

He estado buscando en la ejecución de algunos comandos limpieza cuando un usuario cierra la sesión, sin embargo la edad de desconexión de gancho, aunque aún en funcionamiento, se ha dejado de utilizar por algún tiempo ahora, así que no puede estar con nosotros por mucho tiempo más.

Desafortunadamente, a pesar de launchd ofrece una alternativa conveniente para inicio de sesión de los ganchos, no es tan evidente reemplazo para cerrar la sesión de los ganchos.

Ya he experimentado con la creación de un script de shell que se inicia en el inicio de sesión, y simplemente duerme hasta matar a una señal es recibida, sin embargo, esto no parece funcionar (la secuencia de comandos nunca recibe la señal durante el funcionamiento normal).

De lo contrario, no estoy seguro de cuál es la mejor manera de ejecutar un comando rápido en logout sería? Sé que hay algunas utilidades de terceros que pueden hacerlo, pero hay una manera "correcta" de hacer esto más?

7voto

Haravikk Puntos 332

Parece que Apple no está interesado en salir del gancho de reemplazo, ya que cerraron mi tema preguntando acerca de uno.

Sin embargo, una de las mejoras en Yosemite es que launchd ahora correctamente envía señales hacia abajo para secuencias de comandos de shell. Lo que esto significa es que ahora se puede hacer un registro a cabo la tarea así:

He aquí 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 dormir (de forma asincrónica, hacerlo de forma sincrónica sin el signo no parece funcionar) hasta que recibe uno de los atrapados señales, momento en el que se ejecutará el onLogout función.

Todo lo que necesitas hacer es lanzar la secuencia de comandos mediante un RunAtLoad lanzar el agente o lanzar el demonio y se ejecutará en el inicio de sesión o apagado, aunque es importante tener en cuenta que las tareas que sólo tiene una cantidad limitada de tiempo para completar antes de su muerte en su lugar, así que esto no debería ser usado para cualquier cosa que toma un largo tiempo, o requiere una conexión de red que podría ser retrasado etc.

Por supuesto, esto no es de ninguna utilidad para nadie en Mavericks o anterior, pero en virtud de Yosemite esto ahora parece funcionar como se esperaba; lo que realmente estaba haciendo lo correcto en primer lugar, launchd simplemente no era el envío de las señales correctamente :)

NOTA: Para que esto funcione los scripts de shell parece que necesitan para ser ejecutados directamente por los lanzó, yo.e - no debería invoca a través de sh. Así que si se colocara en ~/Library/Scripts/foo.sh de su programa de argumentos podría parecerse a:

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

2voto

uwotm8 Puntos 166

Usted puede utilizar iHook para ejecutar de inicio de sesión/cierre de sesión ganchos, que he descubierto que todavía trabajo para los no-interactivo de inicio de sesión y cierre de sesión ganchos escrito en Bash y Python en Yosemite.

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

0voto

Si las personas que llegan aquí desde los motores de búsqueda no se preocupan por el uso de un gancho de cierre de sesión, ejecutar, por ejemplo:

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

A continuación, ~/.logouthook que se corrió la próxima vez que salga de la sesión.

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

0voto

Trellis Puntos 109

No puedo obtener el launchd logout elemento para trabajar en 10.10.1, bien, pero la LogoutHook clave en la root de la "com.apple.loginwindow.plist" funciona bien. Hay otros ejemplos de la launchd método?

De todos modos, me escribió un AppleScript para matar el volumen del sistema al cierre de sesión por lo que el sonido de arranque no será oído en el siguiente inicio. Lo que no he trabajado fuera están los detalles para la gestión de múltiples comandos de cierre de sesión basado en un único LogoutHook clave, o si es posible almacenar varios LogoutHook teclas, así que todavía estoy interesado en el Launchd método, que podría ser administrado con Lingon, o incluso Lingon 3, que tiene un ámbito más limitado que el original (es de suponer que existen en la App store).

conjunto de current_Vol a (do shell script "osascript -e \"volumen de salida de (conseguir que los ajustes de volumen)\"")
si el botón de volver de (mostrar cuadro de diálogo "¿ desea silenciar el sonido de arranque, restaurar, o cancelar?" botones {"Silencio", "Restaurar", "Cancelar"} botón predeterminado 1) es "el silencio", a continuación,
 do shell script "mkdir -p /usr/local/logouttask;echo '#!/bin/bash
# salir de secuencia de comandos
osascript -e \"volumen 0\"' > /usr/local/logouttask/logoutscript;sudo defaults write com.apple.loginwindow LogoutHook /usr/local/logouttask/logoutscript;chmod +x /usr/local/logouttask/logoutscript" con privilegios de administrador
otra cosa
trate de
 hacer un script de consola "sudo defaults write com.apple.loginwindow LogoutHook ";rm /usr/local/logouttask/logoutscript" con privilegios de administrador
 mostrar cuadro de diálogo de "El sonido de arranque será escuchada si el ajuste de volumen es mayor que 0 al apagar o reiniciar el sistema." botones {"OK"} botón predeterminado 1
 en caso de error el error_message número de la error_number
 si error_number es 1, entonces
 mostrar cuadro de diálogo de "El script que establece el sistema de volumen a cero al salir no existe. El sonido de arranque será escuchada si el ajuste de volumen es mayor que 0 al apagar o reiniciar el sistema." botones {"OK"} botón predeterminado 1
otra cosa
 mostrar el cuadro de diálogo "Error:" & el error_number & ". "y el error_message botones {"OK"} botón predeterminado 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: