Logout administrativo de usuários
Talvez seja necessário fazer o logout de outros usuários por vários motivos. Alguns possíveis cenários:
-
O usuário cometeu uma violação de segurança;
-
O usuário pode ter usado recursos em excesso;
-
O usuário pode ter um sistema que não responde ou o usuário tem acesso inadequado aos materiais. Nesses casos, é necessário encerrar a sessão usando sinais administrativamente.
Primeiro, para fazer logoff de um usuário, primeiro identifique a sessão de login a ser finalizada. Use o comando w
para listar logins de usuários e processos em execução atuais. Observe as colunas TTY e FROM para determinar as sessões a serem fechadas.
Todas as sessões de login do usuário estão associadas a um dispositivo de terminal (TTY). Se o nome do dispositivo estiver for pts/N
, ele será um pseudo-terminal associado a uma janela de terminal gráfica ou sessão de login remoto. Se for ttyN, o usuário estará em um console do sistema, em um console alternativo ou em outros dispositivos do terminal conectados diretamente.
[user@host ~]$ w
12:43:06 up 27 min, 5 users, load average: 0.03, 0.17, 0.66
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 12:26 14:58 0.04s 0.04s -bash
bob tty3 12:28 14:42 0.02s 0.02s -bash
user pts/1 desktop.example.com 12:41 2.00s 0.03s 0.03s w
[user@host ~]$
Descubra há quanto tempo um usuário está no sistema visualizando o tempo de login da sessão. Os recursos da CPU consumidos por tarefas atuais, incluindo tarefas em segundo plano e processos filhos, estão na coluna JCPU para cada sessão. O consumo de CPU dos processos em primeiro plano atuais está na coluna PCPU.
Os processos e sessões podem ser sinalizados individualmente ou em conjunto. Para encerrar todos os processos para um usuário, use o comando pkill
. Como o processo inicial em uma sessão de login (líder da sessão) é projetado para lidar com solicitações de término de sessão e para ignorar sinais de teclado não intencionais, encerrar todos os processos e shells de login de usuário requer o sinal SIGKILL.
Nota
Os administradores geralmente usam o SIGKILL. É sempre fatal porque o sinal SIGKILL não pode ser manipulado ou ignorado. No entanto, ele força o término sem permitir que processos terminados abruptamente executem rotinas de autolimpeza. A Red Hat recomenda o envio de SIGTERM primeiro, seguido do SIGINT e, somente se os dois falharem, tentar novamente com o SIGKILL.
Primeiro, use o comando pgrep
para identificar os números de PID a serem eliminados. Esse comando opera de maneira semelhante ao comando pkill
, incluindo as mesmas opções, exceto que o comando pgrep
lista processos em vez de eliminá-los.
[root@host ~]# pgrep -l -u bob
6964 bash
6998 sleep
6999 sleep
7000 sleep
[root@host ~]# pkill -SIGKILL -u bob
[root@host ~]# pgrep -l -u bob
Quando os processos que exigem atenção estiverem na mesma sessão de login, ele poderá ser desnecessário para encerrar todos os processos do usuário. Use o comando w
para determinar o terminal de controle para a sessão. Em seguida, encerre somente os processos que fazem referência à mesma ID de terminal. A menos que SIGKILL seja especificado, o líder da sessão (aqui, o shell de login Bash) lida com a solicitação de término com sucesso e sobrevive a ela, mas todos os outros processos da sessão são terminados.
[root@host ~]# pgrep -l -u bob
7391 bash
7426 sleep
7427 sleep
7428 sleep
[root@host ~]# w -h -u bob
bob tty3 18:37 5:04 0.03s 0.03s -bash
[root@host ~]# pkill -t tty3
[root@host ~]# pgrep -l -u bob
7391 bash
[root@host ~]# pkill -SIGKILL -t tty3
[root@host ~]# pgrep -l -u bob
[root@host ~]#
O mesmo término seletivo de processos pode ser aplicado usando relações de processos de pai e filho. Use o comando pstree
para exibir uma árvore de processo ao sistema ou a um único usuário. Use a PID do processo pai para encerrar todos os filhos que foram criados. Desta vez, o shell de login Bash pai sobrevive, porque o sinal é orientado apenas a seus processos filhos.
[root@host ~]# pstree -p bob
bash(8391)─┬─sleep(8425)
├─sleep(8426)
└─sleep(8427)
[root@host ~]# pkill -P 8391
[root@host ~]# pgrep -l -u bob
bash(8391)
[root@host ~]# pkill -SIGKILL -P 8391
[root@host ~]# pgrep -l -u bob
bash(8391)