who
(usando /var/run/utmp
) deve funcionar se o usuário estiver logado via X também.
Em seguida, você pode executar esse script por meio de /etc/crontab
a cada minuto . O que faz:
- faça um loop sobre todos os usuários (
$u
) atualmente conectados em - incrementa o número em
/var/log/accounting-$u
- como isso é feito a cada minuto, o arquivo armazena o tempo total em que o usuário$u
está logado até o momento. - verifique se
$u
atingiu o limite ($allowedtime
), aqui 60 minutos. Se assim for, desligue o sistema ou o que for. 5 minutos antes, envie apenas um aviso (cortesia do @terdon). - finalmente, se o usuário
$u
não foi visto nas últimas 24 horas, exclua/var/log/accounting-$u
e o jogo pode começar do começo.
Como mencionei em um comentário, não acho que desligar o sistema não seja uma boa ideia. Especialmente com este script, porque se um usuário efetuar login novamente enquanto as 24 horas ainda não terminarem, a ação de desligamento será disparada após menos de um minuto (quando o cron iniciar accounting.sh
da próxima vez).
accounting.sh
#!/bin/bash
accountinglogprefix=/var/log/accounting-
allowedtime=60
for u in $(who | cut -d " " -f 1 | sort | uniq); do
if [[ -e ${accountinglogprefix}${u} ]]; then
consumed=$(cat ${accountinglogprefix}${u})
else
consumed=0
fi
echo -n $(( consumed + 1 )) > ${accountinglogprefix}${u}
if [[ $consumed -gt $allowedtime ]]; then
# time is over, do whatever you want
echo "Shutting down..."
elif [[ $consumed -gt $(( allowedtime - 5 )) ]]; then
# notify the user $u that his time is over in 5 minutes with a suitable command
echo "Time's up! Shutting down in 5 minutes..."
fi
# check if e.g. 24h have passed since the user was last seen
if [[ $(( $(date +%s ) - $(stat -c %Y ${accountinglogprefix}${u}) )) -gt $(( 24 * 3600 )) ]]; then
rm ${accountinglogprefix}${u}
fi
done
Observação: este não é um script totalmente maduro (por exemplo, pronto para copiar e colar) - ele deve apenas demonstrar uma abordagem diferente.