Qu'est-ce que la commande de terminal Mac OS X pour déconnecter l'utilisateur actuel?

19

Je voudrais exécuter quelque chose comme "sleep 3600; logout", mais la commande logout bash ne ferme que le terminal actuel. Comment fermer la session complète de Mac OS X?

Grzegorz Adam Hankiewicz
la source

Réponses:

22

L'Applescript suivant déconnectera l'utilisateur actuel:

tell application "System Events" to log out

Vous pouvez envelopper cela dans un alias bash en utilisant la osascriptcommande:

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

Cela revient à cliquer sur ""> Se déconnecter [nom d'utilisateur] ... ", et se déconnectera après une attente de 2 minutes

Ceci est facilement combiné avec la sleepcommande:

alias delayedlogout="sleep 3600; maclogout"

..ou pourrait être combiné en un seul alias:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"
dbr
la source
Bien placé. Une amélioration pour répondre exactement à la question serait d'inclure ce que serait la syntaxe de «sommeil» dans applescript. De plus, je comprends que la deuxième ligne de code a été collée à partir du terminal, mais elle a donc inutilement échappé aux guillemets autour des événements système.
Sacrilicious
@Sacrilicious bon point sur la commande sleep. La citation échappée sur la partie "Evénements système" est nécessaire, caralias maclogout="..."
dbr
2
J'ai récemment découvert que l'exécution de la commande dans un terminal n'arrêterait / ne fermerait pas le système car le terminal lui-même empêchait la déconnexion car bash n'était pas le processus en cours. Cela peut facilement être corrigé en faisant '(sleep 1; command) &', où le sommeil met en file d'attente le travail en arrière-plan et au moment où il exécute le terminal ne pense pas qu'il est occupé.
Grzegorz Adam Hankiewicz
17

Il n'y a aucun moyen "sympa" de déconnecter l'utilisateur actuel de Terminal sous OS X. La manière "désordonnée" de le faire est de tuer le loginwindowprocessus de cet utilisateur . Il tuera grossièrement tous les processus (programmes) exécutés sous votre nom d'utilisateur.

Faire cela est un processus en deux étapes.

  1. Dans le terminal, exécutez ceci:

    ps -Ajc | grep loginwindow
    
  2. Ensuite, exécutez

    sudo kill <pid>
    

    <pid>est le premier nombre (deuxième colonne) de la sortie de la commande ci-dessus.

Utilisez sudo kill -9 pour forcer la suppression du processus que je devais faire pour que cela fonctionne.

Ainsi, par exemple, lorsque si la sortie de la première commande est:

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

Ensuite, je cours sudo kill 41, saisis mon mot de passe, puis je suis déconnecté.

Cela peut être combiné en un alias bash:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"
Josh Hunt
la source
Ne pourriez-vous pas simplement utiliser sudo killall loginwindow? Au moins sur 10,7, le loginwindowprocessus semble être rouvert immédiatement cependant.
Lri
3

Je sais que c'est une vieille question mais cela m'a aidé, la commande dont j'avais besoin sur OS X 10.8 est:

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

L' awkinstruction est différente et kill -9garantit que l'invite de connexion est affichée.

marque l
la source
@gronostaj Croyez-vous vraiment qu'une modification comme celle-ci serait acceptée? Je vois des suggestions de modifications comme celle-ci rejetées comme «modification invalide (tentative de répondre ou de commenter le message existant)» ou de «changement radical» tout le temps - et Markl n'a évidemment pas encore suffisamment de représentants pour poster des commentaires.
Scott
@Scott, vous avez raison, j'ai publié trop rapidement ce commentaire.
gronostaj
2

Je pense avoir trouvé la réponse à la déconnexion complète de Mac OS X sans attendre 2 minutes.

J'ai compris que maintenir Shift, Option et Command et appuyer sur "q" se déconnecterait gracieusement et ne demanderait pas "si vous voulez vous déconnecter".

J'ai donc codé un AppleScript via Automator pour:

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

Si vous êtes connecté à un shell en tant que même utilisateur qui est connecté à l'interface graphique du mac, vous pouvez émettre une commande sans sudo: launchctl reboot logoutqui déconnecte l'utilisateur assez efficacement; il a la mise en garde de ne pas permettre aux applications qui sont en train de quitter d'inviter à l'interaction lors de la fermeture, mais cela ne semble pas impliquer que cela revient à les tuer purement et simplement comme kill(SIG TERM) ou kill -9(SIG KILL).

dlamblin
la source
0

Je dirais que la façon la plus "agréable" après OS X 10.9 pourrait être launchctl gui/$(id -u <username>) bootout

La documentation post OS X 10.9 pour launchctl est trouvée en exécutant launchctl help, mais essentiellement la commande ci-dessus supprimera la session temporaire d'un utilisateur. L'alternative launchctl user/$(id -u <username>) bootoutsupprime la session permanente qui exécute les démons utilisateur alors que l'utilisateur n'est pas connecté.

Cela peut être testé en exécutant launchctl gui/$(id -u) bootout, cela vous déconnectera immédiatement et amènera le système à afficher la fenêtre de connexion (avec un certain retard).

Iain Henderson
la source
Au moins sous El Capitan, la commande correcte est sudo launchctl bootout gui/XXXoù se XXXtrouve l'ID utilisateur numérique (UID). Notez que i) la bootoutsous - commande vient en premier et ii) $(id)renvoie beaucoup plus que l'UID.
Laryx Decidua
Mis à jour pour appeler correctement id (id -u)
Iain Henderson
0

Un bon utilitaire à ajouter à votre terminal est la commande de déconnexion , à utiliser comme:

logout UserName

Voici comment:

  1. Modifiez votre .bash_profile

    nano ~/.bash_profile

  2. Ajoutez cette ligne:

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

  3. Enregistrez le fichier en appuyant sur ctrl+x

  4. Redémarrez le terminal

Vous êtes prêt à partir ;)

Kappe
la source