Strumento per arrestare il sistema in assenza di traffico di rete


13

Sto cercando uno script o uno strumento che posso attivare, quando necessario, che spenga il mio computer se non c'è traffico di rete per esempio 10 minuti, o inferiore a 100 kb, ad esempio.

Sarebbe davvero utile per il download automatico. So che ci sono degli svantaggi, la connessione a Internet è in sospeso, il programma di download è in sospeso, quindi se hai un'idea migliore, per favore dimmelo.

Grazie in anticipo.

Risposte:


15

Ci sono alcuni modi per farlo, ho scritto uno script bash molto semplice che puoi usare per monitorare la velocità in KB p / s per un'interfaccia desiderata, quando la velocità di download scende al di sotto del minimo (che puoi impostare) , quindi il computer verrà spento.

Alcune cose da tenere a mente qui sono:

  • Questo è uno script bash che ho messo insieme rapidamente, ci sono molte tecniche diverse per ottenere lo stesso risultato, tuttavia è facile da capire e implementare.

  • Dovrai eseguire lo script bash da cron come root , ciò significa che devi aprire cron come utente root e aggiungere un cronjob come desideri. Il motivo per cui deve essere nel cron di root è che non sarai in grado di spegnere il computer dalla riga di comando senza essere root, e non puoi usare sudo mentre sei lontano dalla tastiera. Ci sono modi per aggirarlo, ma sto cercando di renderlo il più semplice possibile.

  • Uso uno strumento Linux chiamato ifstat , quindi dovrai installarlo altrimenti lo script non funzionerà:

    sudo apt-get install ifstat
    
  • Esistono 2 opzioni che è possibile modificare nello script seguente, INTERFACE e MIN_SPEED . L'INTERFACCIA deve essere impostata sull'interfaccia che stai usando per scaricare, sia eth0 per il tuo dispositivo cablato o wlan0 per il tuo dispositivo wireless, puoi usare il comando ifconfig dalla riga di comando per vedere quali interfacce hai a disposizione. MIN_SPEED è impostato come desiderato, nel mio esempio l'ho impostato sul numero 5 , il che significa che se la mia velocità di download è inferiore a 5 KB al secondo, il mio computer si spegnerà.

  • Infine, per migliorare lo script potremmo utilizzare un ciclo while e controllare la velocità di download in un periodo di tempo specificato e se la media è inferiore al minimo che dovremmo arrestare, nonché eseguire lo script come servizio, questo è un un modo più accurato di affrontare il problema e sarò felice di aiutarti se questo è il percorso che vorresti seguire.

Copia e incolla il codice seguente in un file in una directory di tua scelta sul tuo computer, ad esempio i_speed.sh , quindi, molto importante, rendi il file eseguibile , per farlo dalla riga di comando, se il tuo file si chiamava i_speed.sh come segue:

    chmod +x i_speed.sh 

Ora puoi sudo -i per eseguire il root e configurare il tuo cronjob per chiamare lo script ad intervalli di tempo che desideri.

Codice per copiare e incollare in un file chiamato 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

AGGIORNARE

Ho scritto un piccolo programma Python come aggiornamento dello script bash sopra che consente di impostare variabili aggiuntive come tentativi e intervallo per ottenere una velocità minima media in un periodo di tempo specificato. Ulteriori aggiornamenti includeranno una GUI per questo programma. Basta copiare e incollare il codice seguente in un file, ad esempio download_monitor.pyeseguirlo come seguesudo 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()

GRAZIE! Questo è esattamente quello che volevo! Ci proverò domani, ho la signora finita in questo momento e lei vuole del tempo libero da Linux ... Ma questo è lo script che stavo cercando. Grazie
cirkator,

Ehi amico:) scusa se non ho risposto prima ma non ho trovato il tempo di provarlo. Ma FUNZIONA:) Ho pensato ancora un po 'allo script, sarebbe possibile programmarlo in modo che si comporti un po' diversamente? Sarebbe bello se lo script si avvia all'avvio, quindi mostra una piccola finestra sul desktop, che dice: "Hai 3 minuti per inserire ad esempio" NO "se vuoi fermare lo script, altrimenti spegnerà il pc se lì non c'è traffico di rete (o inferiore a qualcosa) per esempio un periodo di 5 minuti. "
cirkator,

In questo modo potrei avviare lo script tramite cron ad ogni avvio, ma se sono fisicamente al PC e non voglio che lo script venga eseguito, potrei facilmente disabilitarlo. E se si tratta di un avvio automatico pianificato, diciamo alle 3. solo per il download, farebbe un conto alla rovescia di 3 minuti e quindi impostare lo script in "Vai e modalità monitor". Inoltre è possibile avere lo script sempre in esecuzione e continuare a controllare o posso solo eseguirlo, ad esempio ogni minuto con cron e lasciare che controlli il traffico di rete? GRAZIE ANCORA SEI L'UOMO :)
cirkator,

@cirkator Sono contento che funzioni per te. Certo, tutte queste opzioni sono possibili e forse il modo corretto di procedere. Sarò felice di scrivere un programma più ufficiale ma ci vorrà un po 'più di tempo. Quando avrò messo a posto qualcosa, ti lascerò testare.
Kingmilo,

Prenditi tutto il tempo del mondo, sono solo felice di pensare che stai scrivendo qualcosa per noi nel tuo tempo libero. Davvero apprezzato! :)
cirkator

3

Ho trovato questo argomento molto utile. Senza alcuna conoscenza di Python, ho aggiornato lo script sopra per ottenere la velocità media della rete e andare a dormire a lungo se la velocità media è superiore alla velocità minima. Dopo lunghi periodi di sonno, i calcoli vengono ripristinati e la velocità media viene nuovamente calcolata.

## 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()

Eccezionale. Quindi questo significa che questo cronjob deve essere avviato solo una volta, giusto?
Ben
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.