Je suppose que "pas de données entrantes" signifie.. : tcpdump
n'imprime aucune ligne. Par conséquent, nous devons démarrer une minuterie de 30 minutes et la réinitialiser chaque fois que nous avons besoin d'une nouvelle ligne. tcpdump
imprime une ligne.
Le démarrage est assez simple :
sleep 30m && poweroff
Comment la réinitialiser ? C'est simple : on tue sleep
et le redémarrer.
Comment détecter les nouvelles lignes de tcpdump
? Un bon vieux while read -r
boucle.
Tout mettre ensemble :
#!/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
Notez qu'il peut y avoir des paquets dérangeants de temps en temps. Par exemple, vous avez peut-être configuré APT pour qu'il vérifie les mises à jour toutes les 5 minutes. Cela empêchera l'ordinateur de s'éteindre, car le minuteur sera réinitialisé toutes les 5 minutes.
Si vous en avez besoin, vous pouvez filtrer la sortie de tcpdump
en utilisant grep
ou tout autre outil, comme ceci :
tcpdump | grep -v archive.ubuntu.com | while read -r line