4 votes

Un script de sommeil pour le serveur Ubuntu

Commençons par le début : J'ai un Pi qui réveille mon serveur quand une requête arrive sur tcpdump et ça marche comme sur des roulettes !

Mon problème est que je veux que mon serveur se mette en veille lorsqu'il n'y a pas de données entrantes pendant, disons, 30 minutes. Le serveur n'est utilisé que par moi, à l'intérieur et à l'extérieur de mon réseau local.

Je pense que je dois utiliser tcpdump dans un Shell Shell pour surveiller le port ou l'IP et, s'il n'y a pas d'entrée, il y réagira. J'ai une idée pour faire cela, car j'ai cherché sur internet pendant 2 jours, et essayé beaucoup de choses, mais je n'arrive pas à réussir.

Comment puis-je le faire ?

1voto

Tendayi Mawushe Points 10335

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X