Criando um script de kill do processo ocioso automatizado

2

Gostaria de implementar uma solução para uma instância específica do problema genérico em que os usuários inativos vinculam recursos. Eu sei que a lista de usuários pode ser recuperada com w , o PID associado com ps e a etapa final com kill . No entanto, gostaria de automatizar esse processo para os usuários que ficaram ociosos por mais de uma hora.

A idéia é ler a saída de linha por linha, selecionando as linhas que contêm a expressão regular [0-9]m (localizando os usuários com um tempo ocioso maior que 1: 00m). Em seguida, o TTY associado à linha é extraído e enviado para ps -t , cuja saída contém uma lista dos PIDs a serem enviados para kill -9 . Eu simplesmente não tenho certeza de como amarrar tudo isso junto.

Uma última ressalva: nada associado ao usuário root é interpretado.

    
por Jake Brown 23.11.2015 / 19:18

2 respostas

2

w usa o tempo de acesso do tty para determinar o quão ocioso alguém está, isso é coberto no idletime (), que mostra o arquivo tty e subtrai seu tempo da hora atual. pkill pode usar um terminal como filtro para matar processos.

Então, você quer matar quem não estiver root e ocioso por mais de 5 minutos?

for t in 'w -h | grep -v '^root' | awk '{print $2}''; do find /dev/$t -amin +5 -exec pkill -t $t \; ; done

O que está acontecendo aqui:

  • Use w sem cabeçalhos para encontrar todos os usuários
  • Filtre a raiz
  • imprima o ttys que é a coluna 2
  • para cada linha, faça uma descoberta para testar o tempo de acesso em mais de 5 minutos
  • se for, mate todos os processos nesse terminal com pkill
por 24.11.2015 / 12:07
2

Pode ser melhor usar tempos limite do shell para isso. Para a variável TMOUT de exportação do bash como somente leitura

TMOUT=<seconds>; readonly TMOUT; export TMOUT

para uso de tcsh

set -r autologout <seconds>

em scripts em /etc/profile.d/. Shells atingindo o timeout acima terminarão. A saída de 'w' nem sempre é precisa (por exemplo, não é possível reportar o tempo em x sessões).

Se você tiver usuários fazendo login via ssh, use ClientAliveInterval (veja sshd_config (5)).

    
por 24.11.2015 / 12:42