Outil pour arrêter le système en l'absence de trafic réseau

13

Je recherche un script ou un outil que je peux activer, si nécessaire, qui arrête mon ordinateur s'il n'y a par exemple pas de trafic réseau pendant 10 minutes, ou en dessous de 100 Ko par exemple.

Serait vraiment pratique pour le téléchargement automatique. Je sais qu'il y a des inconvénients à cela, la connexion Internet est suspendue, le programme de téléchargement est suspendu, donc si vous avez une meilleure idée, dites-le moi.

Merci d'avance.

cirkator
la source

Réponses:

15

Il y a quelques façons de procéder, j'ai écrit un script bash très simple que vous pouvez utiliser pour surveiller la vitesse en Ko p / s pour une interface souhaitée, lorsque la vitesse de téléchargement tombe en dessous du minimum (que vous pouvez définir) , votre ordinateur sera alors arrêté.

Voici quelques éléments à garder à l'esprit:

  • Il s'agit d'un script bash que j'ai mis en place rapidement, il existe de nombreuses techniques différentes pour obtenir le même résultat, mais c'est facile à comprendre et à mettre en œuvre.

  • Vous devrez exécuter le script bash depuis cron en tant que root , cela signifie que vous devez ouvrir cron en tant qu'utilisateur root et ajouter un cronjob comme vous le souhaitez. La raison pour laquelle il doit être dans le cron de root est que vous ne pourrez pas arrêter votre ordinateur à partir de la ligne de commande sans être root, et vous ne pouvez pas utiliser sudo lorsque vous êtes loin du clavier. Il existe des moyens de le contourner, mais j'essaie de le garder aussi simple que possible.

  • J'utilise un outil Linux appelé ifstat , vous devrez donc l'installer sinon le script ne fonctionnera pas:

    sudo apt-get install ifstat
    
  • Il y a 2 options que vous pouvez modifier dans le script ci-dessous, l' INTERFACE et MIN_SPEED . L'INTERFACE doit être définie sur l'interface que vous utilisez pour télécharger, soit eth0 pour votre appareil filaire ou wlan0 pour votre appareil sans fil, vous pouvez utiliser la commande ifconfig à partir de la ligne de commande pour voir quelles interfaces vous avez disponibles. Le MIN_SPEED est défini comme vous le souhaitez, dans mon exemple, je l'ai défini sur le nombre 5 , ce qui signifie que si ma vitesse de téléchargement est inférieure à 5 Ko par seconde, mon ordinateur s'arrêtera.

  • Enfin, pour améliorer le script, nous pourrions utiliser une boucle while et vérifier la vitesse de téléchargement sur une période de temps spécifiée et si la moyenne est inférieure au minimum, nous arrêterions, ainsi que d'exécuter le script en tant que service, c'est un manière plus précise d'aborder le problème et je serai heureux de vous aider avec cela si c'est la route que vous souhaitez suivre.

Copiez et collez le code ci-dessous dans un fichier dans un répertoire de votre choix sur votre ordinateur, exemple i_speed.sh , puis, très important, rendez le fichier exécutable , pour ce faire à partir de la ligne de commande, si votre fichier s'appelait i_speed.sh comme suit:

    chmod +x i_speed.sh 

Vous pouvez maintenant sudo -i pour rooter et configurer votre cronjob pour appeler le script aux intervalles de temps que vous désirez.

Code à copier et coller dans un fichier appelé i_speed.sh:

#!/bin/bash

# Bash script to determine a network interfaces current transfer speed and 
  shutdown the computer if the current transfer speed is less than MIN_SPEED

# Set INTERFACE to the network interface you would like to monitor
INTERFACE='wlan0'

# Set MIN_SPEED in KB per second that network interface (INTERFACE) speed 
  must be larger than, if speed falls below this number then computer will shutdown.
MIN_SPEED=5


# This is where the work get's done:
CURRENT_SPEED=`ifstat -i $INTERFACE 1 1 | awk '{print $1}' | sed -n '3p'`
INT=${CURRENT_SPEED/\.*}

if [ $INT -lt $MIN_SPEED ]; then
    shutdown -h now
else
    exit
fi

MISE À JOUR

J'ai écrit un petit programme python en tant que mise à jour du script bash ci-dessus qui vous permet de définir des variables supplémentaires telles que les tentatives et l'intervalle pour obtenir une vitesse min moyenne sur une période de temps spécifiée. D'autres mises à jour comprendront une interface graphique pour ce programme. Copiez et collez simplement le code ci-dessous dans un fichier, exemple, download_monitor.pypuis exécutez-le comme suitsudo python download_monitor.py

## Download Monitor v0.1 - March 2012

# Set the interface you wish to monitor, eg: eth0, wlan0, usb0
INTERFACE = "eth0"

# Set the minimum download speed in KB/s that must be achieved.
MINIMUM_SPEED = 15

# Set the number of retries to test for the average minimum speed. If the average speed is less
# than the minimum speed for x number of retries, then shutdown.
RETRIES = 5

# Set the interval (in seconds), between retries to test for the minimum speed.
INTERVAL = 10


import os, time
from commands import getoutput

def worker ():
    RETRIES_COUNT = RETRIES
    while True:
        SPEED = int(float(getoutput("ifstat -i %s 1 1 | awk '{print $1}' | sed -n '3p'" % INTERFACE)))
        if (SPEED < MINIMUM_SPEED and RETRIES_COUNT <= 0):
            os.system("shutdown -h now")
        elif SPEED < MINIMUM_SPEED:
            RETRIES_COUNT -= 1
            time.sleep(INTERVAL)
        else:
            RETRIES_COUNT = RETRIES
            time.sleep(INTERVAL)

worker()
kingmilo
la source
MERCI! C'est exactement ce que je voulais! Je vais essayer ça demain, j'ai le missus en ce moment et elle veut du temps sans Linux ... Mais c'est le script que je cherchais. Merci
cirkator
Hey man:) désolé de ne pas avoir répondu plus tôt mais je n'ai pas trouvé le temps de le tester. Mais ça FONCTIONNE:) J'ai réfléchi un peu plus au script, serait-il possible de le programmer pour qu'il se comporte un peu différemment? Ce serait génial si le script démarre au démarrage, puis affiche une petite fenêtre sur le bureau, qui dit: "Vous avez 3 minutes pour entrer par exemple" NON "si vous voulez arrêter le script, sinon il arrêtera le PC s'il y a il n'y a pas de trafic réseau (ou en dessous de quelque chose) pendant par exemple une période de 5 minutes. "
cirkator
De cette façon, je pourrais démarrer le script via cron à chaque démarrage, mais si je suis physiquement sur le PC et que je ne veux pas que le script s'exécute, je peux facilement le désactiver. Et si c'est un démarrage automatique programmé qui permet de dire à 3h du matin juste pour le téléchargement, il compterait 3 minutes, puis mettrait le script en mode "Go and monitor-mode". Est-il également possible d'avoir le script en cours d'exécution tout le temps et de continuer à vérifier ou puis-je l'exécuter par exemple toutes les minutes avec cron et le laisser vérifier l'absence de trafic réseau? MERCI ENCORE VOUS ÊTES L'HOMME :)
cirkator
@cirkator Je suis content que cela fonctionne pour vous. Bien sûr, toutes ces options sont possibles et peut-être la bonne façon de procéder. Je serai heureux d'écrire un programme plus officiel mais cela prendra un peu plus de temps. Une fois que j'ai quelque chose en place, je vous laisse tester.
kingmilo
Prenez tout le temps du monde, je suis juste content de penser que vous codez quelque chose pour nous pendant votre temps libre. Très apprécié! :)
cirkator
3

J'ai trouvé ce sujet très utile. Sans connaissance de Python, j'ai mis à jour le script ci-dessus pour obtenir la vitesse moyenne du réseau et passer en veille prolongée si la vitesse moyenne est supérieure à la vitesse minimale. Après un long sommeil, les calculs sont réinitialisés et la vitesse moyenne est à nouveau calculée.

## Download Monitor v0.2 - June 2017

# Set the interface you wish to monitor, eg: eth0, wlan0, usb0
INTERFACE = "enp4s0"

# Set the minimum download speed in KB/s that must be achieved.
MINIMUM_SPEED = 10

# Set the number of retries to test for the average minimum speed.
RETRIES = 5

# Set the interval (in seconds), between retries to calculate average speed.
INTERVAL = 5

# Set the interval (in seconds), between recalculating average speed
LONG_INTERVAL = 600

import os, time
from commands import getoutput

def worker ():
    RETRIES_COUNT = 1
    SPEED = 0
    while True:
        # Sum downstream and upstream and add with previous speed value
        # {print $1} use just downstream
        # {print $2} use just upstream
        # {print $1+$2} use sum of downstream and upstream
        SPEED += int(float(getoutput("ifstat -i %s 1 1 | awk '{print $1+$2}' | sed -n '3p'" % INTERFACE)))

        if RETRIES_COUNT > RETRIES:
            # Calculate average speed from all retries
            AVG_SPEED = int(float(SPEED) / float(RETRIES_COUNT))

            # If average speed is below minimum speed - suspend
            if AVG_SPEED < MINIMUM_SPEED:
                os.system("shutdown -h now")
            # Else reset calculations and wait for longer to retry calculation
            else:
                RETRIES_COUNT = 1
                SPEED = 0
                time.sleep(LONG_INTERVAL)
        else:
            RETRIES_COUNT += 1
            time.sleep(INTERVAL)

worker()
user3215145
la source
Impressionnant. Cela signifie donc que ce cronjob ne doit être démarré qu'une seule fois, non?
Ben