O tempo inativo é derivado do último horário de acesso do dispositivo tty, portanto, você poderia fazer:
kill_idle() (
sig=$1
old_ttys=$(find /dev/pts -type c ! -name ptmx -amin +60 -printf %p,)
[ "$#" -eq 0 ] || pkill "-$sig" -t "$old_ttys"
)
kill_idle HUP; sleep 3; kill_idle KILL
Para matar todos os processos controlados por aqueles ttys inativos.
Agora, conforme apontado corretamente pelo @rudimeter, /dev/pts
dispositivos nem sempre são usados apenas para sessões de terminal de usuário, portanto, podemos acabar com processos de eliminação que usam pseudo-terminais para outros propósitos (como expect
, socat
ou pty usando outras disciplinas de terminal).
Coisas como emuladores de terminal, getty, screen, sshd registram os pseudo-terminais que eles geram no banco de dados utmp
, que é o que who -u
consulta.
Para obter os terminais ociosos da saída de who -u
, você poderia fazer:
old_ttys=$(
who -u | awk '$5 != "." && $5 !~ /^00/ {printf "%s,", $2}'
)
Observe, entretanto, que a saída de who -u
pode ser adulterada em sistemas que usam utempter
para registrar o arquivo.
Por exemplo, aqui usando socat
para criar o pty:
name=$':0)\nnobody pts/2 2016-10-05 00:00 old 123 (:0' socat pty \
system:'/usr/lib/x86_64-linux-gnu/utempter/utempter add \"$name\"; sleep infinity',nofork &
utempter
é um comando sgid que adiciona a entrada em utmp. Ele valida sua entrada até certo ponto, já que em seu stdin tem que apontar para ptmx
e os pts correspondentes devem ser de propriedade do responsável pela chamada, mas ele não valida o campo host . Aqui, especificando um campo host com um caractere de nova linha, estamos fazendo uma entrada falsa na saída de who -u
:
nobody pts/2 2016-10-05 00:00 old 123 (:0)
Isso significa que você pode matar os processos em qualquer pts.
Para listar apenas os terminais inativos:
who -u | awk '$5 != "." && $5 !~ /^00/'
Ou apenas para listar o usuário, o tempo ocioso e o pid do processo de controle do terminal:
who -u | awk '
$5 != "." && $5 !~ /^00/ {printf "%-16s %6s %d\n", $1, $5, $6}'
O comando w
pode fornecer uma saída mais útil (também não é vulnerável ao exploit mencionado acima):
$ w -sf | awk 'NR > 2 && $3 !~ /[0-9]s?$/'
stephane tty7 50days /usr/bin/lxsession -s LXDE -e LXDE
stephane pts/1 3:07m /bin/zsh
stephane pts/3 1:25m elinks