O que é o comando do terminal do Mac OS X para desconectar o usuário atual?

19

Eu gostaria de executar algo como "sleep 3600; logout", mas o comando logout bash fecha apenas o terminal atual. Como fecho a sessão completa do Mac OS X?

Grzegorz Adam Hankiewicz
fonte

Respostas:

22

O Applescript a seguir desconectará o usuário atual:

tell application "System Events" to log out

Você pode finalizar isso em um alias do bash usando o osascriptcomando:

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

É o mesmo que clicar em "> Sair [nome de usuário] ..." e sairá após 2 minutos de espera

Isso é facilmente combinado com o sleepcomando:

alias delayedlogout="sleep 3600; maclogout"

..ou pode ser combinado em um único alias:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"
dbr
fonte
Bem colocado. Um aprimoramento para responder exatamente à pergunta seria incluir qual seria a sintaxe do 'sono' no AppleScript. Além disso, entendo que a segunda linha de código foi colada no terminal, mas, portanto, escapou desnecessariamente das aspas duplas em torno dos Eventos do Sistema.
Sacrilicious
@Sacrilicious bom ponto sobre o comando dormir. A citação de escape na parte "System Events" é necessária, devido a:alias maclogout="..."
dbr
2
Descobri recentemente que a execução do comando em um terminal não encerra / fecha o sistema devido ao próprio Terminal, impedindo que o logout devido ao bash não seja o processo atual. Isso pode ser facilmente corrigido com '(sleep 1; command) &', onde o sono enfileira o trabalho em segundo plano e, quando é executado, o terminal não pensa que está ocupado.
Grzegorz Adam Hankiewicz
17

Não há uma maneira "agradável" de desconectar o usuário atual do Terminal no OS X. A maneira 'confusa' de fazer isso é matar o loginwindowprocesso desse usuário . Isso irá matar de forma grosseira todos os processos (programas) executados com o seu nome de usuário.

Fazer isso é um processo de duas etapas.

  1. No terminal, execute o seguinte:

    ps -Ajc | grep loginwindow
    
  2. Então corra

    sudo kill <pid>
    

    Onde <pid>está o primeiro número (segunda coluna) da saída do comando acima.

Use o sudo kill -9 para forçar o processo que eu precisei fazer para que isso funcionasse.

Por exemplo, quando se a saída para o primeiro comando for:

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

Então eu corria sudo kill 41, digitava minha senha e depois saí.

Isso pode ser combinado em um alias do bash:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"
Josh Hunt
fonte
Você não poderia simplesmente usar sudo killall loginwindow? Pelo menos em 10.7 o loginwindowprocesso parece ser aberto novamente imediatamente imediatamente.
Lri
3

Eu sei que essa é uma pergunta antiga, mas ela me ajudou, o comando que eu precisava no OS X 10.8 é:

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

A awkinstrução é diferente e kill -9garante que o prompt de login seja mostrado.

marca l
fonte
@gronostaj Você realmente acredita que uma edição como essa seria aceita? Vejo edições sugeridas como essa rejeitadas como "edição inválida (tentativa de responder ou comentar sobre a postagem existente)" ou "mudança radical" o tempo todo - e markl obviamente ainda não tem representante suficiente para postar comentários.
28413 Scott
@ Scott, você está certo, eu estive postando muito rápido esse comentário.
gronostaj
2

Acho que encontrei a resposta para fazer logoff graciosamente do Mac OS X sem a espera de 2 minutos.

Eu descobri que pressionar Shift, Option e Command e pressionar "q" sairá normalmente e não perguntará "se você deseja sair".

Então, eu codifiquei um AppleScript através do Automator para:

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

Se você estiver conectado a um shell como o mesmo usuário conectado à GUI do Mac, poderá emitir um comando sudo-less: o launchctl reboot logoutque efetua logout do usuário com bastante eficiência; ele tem a ressalva de não permitir que os aplicativos que estão sendo interrompidos solicitem interação ao sair, no entanto, não parece implicar que isso é a mesma coisa que eliminá-los imediatamente como um kill(SIG TERM) ou kill -9(SIG KILL).

dlamblin
fonte
0

Eu diria que a maneira "mais legal" de postar o OS X 10.9 pode ser launchctl gui/$(id -u <username>) bootout

A documentação pós OS X 10.9 para o launchctl é encontrada em execução launchctl help, mas essencialmente o comando acima desmontará a sessão temporária do usuário. A alternativa launchctl user/$(id -u <username>) bootoutinterrompe a sessão permanente que executa os daemons dos usuários enquanto o usuário não está conectado.

Isso pode ser testado em execução launchctl gui/$(id -u) bootout, você será desconectado imediatamente e fará com que o sistema exiba a janela de login (com algum atraso).

Iain Henderson
fonte
Pelo menos no El Capitan, o comando correto é sudo launchctl bootout gui/XXXonde XXXestá o ID do usuário numérico (UID). Observe que i) o bootoutsubcomando vem primeiro e ii) $(id)retorna muito mais que o UID.
Laryx Decidua
Atualizado para chamar corretamente o ID (id -u)
Iain Henderson
0

Um bom utilitário para adicionar ao seu Terminal é o comando logout , para ser usado como:

logout UserName

Aqui o como:

  1. Edite seu .bash_profile

    nano ~/.bash_profile

  2. Adicione esta linha:

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

  3. Salve o arquivo pressionando ctrl+x

  4. Reinicie o terminal

Você está pronto para ir ;)

Kappe
fonte