Esegui script al logout senza utilizzare il gancio di disconnessione

9

Ho cercato di eseguire alcuni comandi di cleanup quando un utente si disconnette, tuttavia la vecchia funzione di hook di logout, sebbene sia ancora funzionante, è stata deprecata per un po 'di tempo, quindi potrebbe non essere con noi per molto più tempo.

Sfortunatamente, anche se launchd fornisce un'alternativa conveniente ai ganci di accesso, non esiste una sostituzione così ovvia per gli hook di disconnessione.

Ho già sperimentato la creazione di uno script di shell che viene avviato all'accesso, e semplicemente dorme fino a quando non viene ricevuto un segnale di kill, tuttavia questo non sembra funzionare (lo script non riceve mai il segnale durante il normale funzionamento). / p>

Altrimenti non sono sicuro di quale sarebbe il modo migliore per eseguire un comando rapido al logout? So che ci sono alcune utilità di terze parti che possono farlo, ma c'è un modo "corretto" per farlo più?

    
posta Haravikk 05.10.2014 - 13:14
fonte

4 risposte

7

Sembra che Apple non sia interessata a una sostituzione del gancio di uscita, in quanto hanno chiuso il mio problema informandone.

Tuttavia, uno dei miglioramenti di Yosemite è che launchd ora invia correttamente i segnali agli script di shell. Ciò significa che ora puoi svolgere un'attività di disconnessione in questo modo:

Ecco un esempio 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

Questo semplicemente dormirà (in modo asincrono, facendolo in modo sincrono senza che la e commerciale non funzioni) finché non riceve uno dei segnali intrappolati, a quel punto eseguirà la funzione onLogout .

Tutto ciò che devi fare è avviare lo script utilizzando un% launch agent o un daemon di lancio e verrà eseguito al logout o all'arresto, anche se è importante ricordare che le attività hanno solo una quantità limitata di tempo per completa prima di essere eliminati, quindi non dovrebbe essere usato per eseguire tutto ciò che richiede molto tempo o richiede una connessione di rete che potrebbe essere ritardata ecc.

Ovviamente questo non è di alcuna utilità per nessuno su Mavericks o prima, ma sotto Yosemite questo ora sembra funzionare come previsto; quindi, in effetti, stavo proprio andando bene, RunAtLoad non inviava correttamente i segnali:)

NOTA: Affinché questo funzioni, gli script della shell sembrano aver bisogno di essere eseguiti direttamente tramite il lancio, vale a dire che non dovrebbe essere invocato tramite launchd . Quindi se fosse collocato in sh gli argomenti del tuo programma potrebbero essere:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
    
risposta data 19.10.2014 - 16:07
fonte
2

Puoi usare iHook per eseguire hook di login / logout, che ho trovato che funzionano ancora per login non interattivi e hook di logout scritti in Bash e Python su Yosemite.

link

    
risposta data 21.10.2014 - 19:24
fonte
0

Se gli altri che arrivano dai motori di ricerca non si preoccupano dell'utilizzo di un hook di disconnessione, esegui ad esempio:

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

Quindi ~/.logouthook viene eseguito alla successiva disconnessione.

Il valore della chiave LogoutHook deve essere un percorso verso un eseguibile e non un comando di shell. Il comando defaults modifica /var/root/Library/Preferences/com.apple.loginwindow.plist .

    
risposta data 06.10.2014 - 13:46
fonte
0

Non riesco a far funzionare l'elemento di logout di launchd anche in 10.10.1, ma la chiave LogoutHook in "com.apple.loginwindow.plist" di root funziona bene. Ci sono altri esempi per il metodo launchd?

Ad ogni modo, ho scritto un AppleScript per eliminare il volume di sistema al logout in modo che il prossimo avvio non venga ascoltato al prossimo avvio. Quello che non ho capito sono i dettagli per la gestione di più comandi di logout basati su una singola chiave LogoutHook, o se è possibile memorizzare più chiavi LogoutHook, quindi sono ancora interessato al metodo Launchd, che potrebbe essere gestito con Lingon, o anche Lingon 3, che ha un ambito molto più ristretto rispetto all'originale (presumibilmente per esistere nell'App store).

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
    
risposta data 27.01.2015 - 21:21
fonte

Leggi altre domande sui tag