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)

Referências