Qual è il comando terminale di Mac OS X per disconnettere l'utente corrente?


19

Vorrei eseguire qualcosa come "sleep 3600; logout", ma il comando bash logout chiude solo il terminale corrente. Come posso chiudere l'intera sessione di Mac OS X?

Risposte:


22

Il seguente Applescript disconnetterà l'utente corrente:

tell application "System Events" to log out

Puoi racchiuderlo in un alias bash usando il osascriptcomando:

alias maclogout="osascript -e 'tell application \"System Events\" to log out'"

È lo stesso che fare clic su "> Disconnetti [nome utente] ..." e si disconnetterà dopo 2 minuti di attesa

Questo è facilmente combinato con il sleepcomando:

alias delayedlogout="sleep 3600; maclogout"

..o potrebbe essere combinato in un singolo alias:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"

Ben messo. Un miglioramento per rispondere esattamente alla domanda sarebbe quello di includere quale sarebbe la sintassi del "sonno" nel comando di apple. Inoltre, capisco che la seconda riga di codice è stata incollata dal terminale, ma quindi è sfuggita inutilmente alle doppie virgolette intorno agli eventi di sistema.
Sacrificio,

@Sacrilicious buon punto sul comando sleep. La citazione di escape nella parte "Eventi di sistema" è necessaria a causa dialias maclogout="..."
dbr

2
Recentemente ho scoperto che l'esecuzione del comando in un terminale non spegnerà / chiuderà il sistema a causa del Terminale stesso impedendo il logout a causa del fatto che bash non è il processo corrente. Questo può essere facilmente risolto facendo '(sleep 1; comando) &', dove il sonno mette in coda il lavoro in background e quando esegue il terminale non pensa che sia occupato.
Grzegorz Adam Hankiewicz,

17

Non esiste un modo "carino" per disconnettere l'utente corrente dal Terminale in OS X. Il modo "disordinato" per farlo è quello di uccidere il loginwindowprocesso dell'utente . Ucciderà bruscamente tutti i processi (programmi) in esecuzione con il tuo nome utente.

Fare questo è un processo in due fasi.

  1. Nel terminale, esegui questo:

    ps -Ajc | grep loginwindow
    
  2. Quindi, corri

    sudo kill <pid>
    

    Dov'è <pid>il primo numero (seconda colonna) dall'output del comando precedente.

Usa sudo kill -9 per forzare l'uccisione del processo che ho dovuto fare per farlo funzionare.

Quindi, ad esempio, quando l'output del primo comando è:

joshhunt    41     1    41 5e15c08    0 Ss     ??    3:13.09 loginwindow

Quindi corro sudo kill 41, inserisco la mia password e poi mi disconnetto.

Questo può essere combinato in un alias bash:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"

Non potresti semplicemente usare sudo killall loginwindow? Almeno su 10.7 il loginwindowprocesso sembra essere riaperto immediatamente però.
Lri,

3

So che questa è una vecchia domanda ma mi ha aiutato, il comando di cui avevo bisogno su OS X 10.8 è:

ps -Ajc | grep loginwindow | awk '{print $2}' | sudo xargs kill -9

L' awkistruzione è diversa e kill -9garantisce che venga visualizzato il prompt di accesso.


@gronostaj Credi davvero che una modifica del genere sarebbe accettata? Vedo le modifiche suggerite come quelle respinte come "modifica non valida (tentare di rispondere o commentare il post esistente)" o "cambiamento radicale" continuamente - e Markl ovviamente non ha ancora una risposta sufficiente per pubblicare commenti.
Scott,

@Scott hai ragione, ho postato troppo velocemente quel commento.
gronostaj,

2

Penso di aver trovato la risposta a come disconnettersi con grazia da Mac OS X senza l'attesa di 2 minuti.

Ho capito che tenendo premuto Maiusc, Opzione e Comando e premendo "q" si disconnetterà con grazia e non verrà chiesto "se si desidera disconnettersi".

Quindi ho codificato un AppleScript tramite Automator per:

tell application "System Events"
     keystroke "q" using {command down, shift down, option down}
end tell

0

Se hai effettuato l'accesso a una shell come lo stesso utente che ha effettuato l'accesso alla GUI del Mac, potresti emettere un comando sudo-less: launchctl reboot logoutche disconnette l'utente in modo abbastanza efficace; ha l'avvertenza di non consentire alle app a cui si sta per interrompere la richiesta di interazione durante la chiusura, tuttavia non sembra implicare che ciò equivale a ucciderle completamente come potrebbe fare un kill(SIG TERM) o kill -9(SIG KILL).


0

Direi che potrebbe essere il modo "più bello" dopo OS X 10.9 launchctl gui/$(id -u <username>) bootout

La documentazione post OS X 10.9 per launchctl viene trovata eseguendo launchctl help, ma essenzialmente il comando sopra farà smontare la sessione temporanea di un utente. L'alternativa launchctl user/$(id -u <username>) bootoutabbatte la sessione permanente che esegue i demoni dell'utente mentre l'utente non ha effettuato l'accesso.

Questo può essere testato eseguendo launchctl gui/$(id -u) bootout, questo ti disconnetterà immediatamente e causerà al sistema di visualizzare la finestra di accesso (con qualche ritardo).


Almeno in El Capitan, il comando corretto è sudo launchctl bootout gui/XXXdove si XXXtrova l'ID utente numerico (UID). Si noti che i) il bootoutsottocomando viene prima di tutto e ii) $(id)restituisce molto più dell'UID.
Laryx Decidua,

Aggiornato per chiamare correttamente id (id -u)
Iain Henderson il

0

Una bella utility da aggiungere al tuo Terminale è il comando di logout , da usare come:

logout UserName

Ecco come:

  1. Modifica il tuo .bash_profile

    nano ~/.bash_profile

  2. Aggiungi questa riga:

    logout() {sudo launchctl bootout user/$(id -u "$1")}

  3. Salvare il file premendo ctrl+x

  4. Riavvia il terminale

Sei pronto per andare ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.