¿Qué es el comando de terminal Mac OS X para cerrar la sesión del usuario actual?

19

Me gustaría ejecutar algo como "sleep 3600; logout", pero el comando logout bash solo cierra el terminal actual. ¿Cómo cierro la sesión completa de Mac OS X?

Grzegorz Adam Hankiewicz
fuente

Respuestas:

22

El siguiente Applescript cerrará la sesión del usuario actual:

tell application "System Events" to log out

Puede concluir esto en un alias bash usando el osascriptcomando:

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

Es lo mismo que hacer clic en "> Cerrar sesión [nombre de usuario] ...", y cerrará sesión después de 2 minutos de espera.

Esto se combina fácilmente con el sleepcomando:

alias delayedlogout="sleep 3600; maclogout"

..o podría combinarse en un solo alias:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"
dbr
fuente
Así poner. Una mejora para responder exactamente a la pregunta sería incluir cuál sería la sintaxis de 'suspensión' en AppleScript. Además, entiendo que la segunda línea de código se pegó desde la terminal, pero por lo tanto se escapó innecesariamente de las comillas dobles alrededor de los eventos del sistema.
Sacrilicious
@Sacrilicious buen punto sobre el comando de suspensión. La cita de escape en la parte "Eventos del sistema" es necesaria debido aalias maclogout="..."
dbr
2
Recientemente descubrí que ejecutar el comando en una terminal no apagará / cerrará el sistema debido a que la Terminal misma impide el cierre de sesión debido a que bash no es el proceso actual. Esto se puede solucionar fácilmente haciendo '(suspensión 1; comando) &', donde la suspensión pone en cola el trabajo en segundo plano y cuando se ejecuta el terminal no cree que esté ocupado.
Grzegorz Adam Hankiewicz
17

No hay una forma "agradable" de desconectar al usuario actual de la Terminal en OS X. La forma "desordenada" de hacerlo es matar el loginwindowproceso de ese usuario . Eliminará groseramente todos los procesos (programas) que se ejecutan con su nombre de usuario.

Hacer esto es un proceso de dos pasos.

  1. En la terminal, ejecuta esto:

    ps -Ajc | grep loginwindow
    
  2. Entonces corre

    sudo kill <pid>
    

    Donde <pid>es el primer número (segunda columna) de la salida del comando anterior.

Use sudo kill -9 para forzar a matar el proceso que tuve que hacer para que esto funcione.

Entonces, por ejemplo, cuando si la salida al primer comando es:

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

Luego corría sudo kill 41, ingresaba mi contraseña y luego me desconectaba.

Esto se puede combinar en un alias bash:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"
Josh Hunt
fuente
¿No podrías usarlo sudo killall loginwindow? Al menos en 10.7, el loginwindowproceso parece abrirse de nuevo inmediatamente.
Lri
3

Sé que esta es una vieja pregunta, pero me ayudó, el comando que necesitaba en OS X 10.8 es:

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

La awkdeclaración es diferente y kill -9garantiza que se muestre la solicitud de inicio de sesión.

marca l
fuente
@gronostaj ¿Realmente crees que una edición como esa sería aceptada? Veo ediciones sugeridas como esa rechazadas como "edición no válida (intento de responder o comentar sobre la publicación existente)" o "cambio radical" todo el tiempo, y Markl obviamente todavía no tiene suficiente representante para publicar comentarios.
Scott
@ Scott, tienes razón, he sido demasiado rápido publicando ese comentario.
gronostaj
2

Creo que he encontrado la respuesta a cómo cerrar con gracia Mac OS X sin la espera de 2 minutos.

Me di cuenta de que mantener presionadas las teclas Mayús, Opción y Comando y presionar "q" cerrará la sesión con gracia y no preguntará "si desea cerrar sesión".

Así que codifiqué un AppleScript a través de Automator para:

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

Si ha iniciado sesión en un shell como el mismo usuario que ha iniciado sesión en la interfaz gráfica de usuario de la Mac, puede emitir un comando sin sudo: launchctl reboot logoutque cierra la sesión del usuario de manera bastante efectiva; tiene la advertencia de no permitir que las aplicaciones que se están cerrando provoquen interacción mientras se cierra, sin embargo, no parece implicar que esto sea lo mismo que matarlas directamente como un kill(SIG TERM) o kill -9(SIG KILL).

dlamblin
fuente
0

Yo diría que la forma "más agradable" de publicar OS X 10.9 podría ser launchctl gui/$(id -u <username>) bootout

La documentación posterior a OS X 10.9 para launchctl se encuentra ejecutando launchctl help, pero esencialmente el comando anterior derribará la sesión temporal de un usuario. La alternativa launchctl user/$(id -u <username>) bootoutelimina la sesión permanente que ejecuta demonios de usuario mientras el usuario no está conectado.

Esto se puede probar ejecutando launchctl gui/$(id -u) bootout, esto inmediatamente cerrará la sesión y hará que el sistema muestre la ventana de inicio de sesión (con algún retraso).

Iain Henderson
fuente
Al menos bajo El Capitán, el comando correcto es sudo launchctl bootout gui/XXXdónde XXXestá la ID de usuario numérica (UID). Tenga en cuenta que i) el bootoutsubcomando es lo primero, y ii) $(id)devuelve mucho más que el UID.
Laryx Decidua
Actualizado para llamar correctamente id (id -u)
Iain Henderson
0

Una buena utilidad para agregar a su Terminal es el comando de cierre de sesión , que se utilizará como:

logout UserName

Aquí el cómo:

  1. Edite su .bash_profile

    nano ~/.bash_profile

  2. Agrega esta línea:

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

  3. Guarde el archivo presionando ctrl+x

  4. Reiniciar el terminal

Estás listo para ir;)

Kappe
fuente