Estou assumindo que "nenhum dado recebido" significa: tcpdump
não está imprimindo nenhuma linha. Portanto, temos que iniciar um temporizador de 30 minutos e redefini-lo sempre que tcpdump
imprimir uma linha.
Começar é bem simples:
sleep 30m && poweroff
Como podemos redefini-lo? Simples: matamos sleep
e reiniciá-lo.
Como detectamos novas linhas de tcpdump
? Um bom e velho while read -r
loop.
Colocando tudo junto:
#!/bin/bash
set -e
shutdown-timer() {
# Waits 30 minutes and shuts down the computer.
sleep 30m && poweroff
}
reset-timer() {
# Kills 'shutdown-timer' (if it's running) and
# restarts it, saving its PID in 'timerpid'.
if [[ -n "$timerpid" ]]
then
kill "$timerpid" || true
fi
shutdown-timer &
timerpid="$!"
}
# Start the timer for the first time.
reset-timer
tcpdump | while read -r line
do
# A new packet was sent or received.
reset-timer
done
Note que pode haver pacotes preocupantes de vez em quando. Por exemplo, você pode ter configurado o APT para verificar atualizações a cada 5 minutos. Isso impedirá que o computador seja desligado, porque o timer será redefinido a cada 5 minutos.
Se precisar, você pode filtrar a saída de tcpdump
usando grep
ou qualquer outra ferramenta, assim:
tcpdump | grep -v archive.ubuntu.com | while read -r line