Tool zum Herunterfahren des Systems, wenn kein Netzwerkverkehr vorliegt

13

Ich suche ein Skript oder ein Tool, das ich bei Bedarf einschalten kann und das meinen Computer herunterfährt, wenn z. B. 10 Minuten lang kein Netzwerkverkehr besteht, oder beispielsweise unter 100 KB.

Wäre sehr praktisch für das automatische Herunterladen. Ich weiß, dass es Nachteile gibt, die Internetverbindung hängt, das Download-Programm hängt. Wenn Sie also eine bessere Idee haben, sagen Sie es mir bitte.

Danke im Voraus.

Zirkulator
quelle

Antworten:

14

Hierfür gibt es einige Möglichkeiten. Ich habe ein sehr einfaches Bash-Skript geschrieben, mit dem Sie die Geschwindigkeit in KB pro Sekunde für eine gewünschte Schnittstelle überwachen können, wenn die Download- Geschwindigkeit unter das von Ihnen festgelegte Minimum fällt. , dann wird Ihr Computer heruntergefahren.

Hier sind einige Dinge zu beachten:

  • Dies ist ein Bash-Skript, das ich schnell zusammengestellt habe. Es gibt viele verschiedene Techniken, um das gleiche Ergebnis zu erzielen. Es ist jedoch einfach zu verstehen und zu implementieren.

  • Sie müssen das Bash-Skript von cron als root ausführen, dh Sie müssen cron als root-Benutzer öffnen und einen Cronjob wie gewünscht hinzufügen. Der Grund, warum es in root's cron sein muss, ist, dass Sie Ihren Computer nicht über die Befehlszeile herunterfahren können, ohne root zu sein, und Sie können sudo nicht verwenden, wenn Sie nicht auf der Tastatur sind. Es gibt Möglichkeiten, es zu umgehen, aber ich versuche es so einfach wie möglich zu halten.

  • Ich benutze ein Linux-Tool namens ifstat , deshalb musst du es installieren, sonst funktioniert das Skript nicht:

    sudo apt-get install ifstat
    
  • Es gibt zwei Optionen, die Sie im folgenden Skript ändern können: INTERFACE und MIN_SPEED . Die SCHNITTSTELLE muss auf die Schnittstelle eingestellt sein, die Sie zum Herunterladen verwenden, entweder eth0 für Ihr kabelgebundenes Gerät oder wlan0 für Ihr kabelloses Gerät. Sie können den Befehl ifconfig in der Befehlszeile verwenden, um festzustellen, welche Schnittstellen verfügbar sind. Die MIN_SPEED ist wie gewünscht eingestellt, in meinem Beispiel habe ich sie auf die Nummer 5 gesetzt , was bedeutet, dass mein Computer heruntergefahren wird, wenn meine Download-Geschwindigkeit weniger als 5 KB pro Sekunde beträgt .

  • Um das Skript zu verbessern, können wir eine while-Schleife verwenden und die Download-Geschwindigkeit über einen bestimmten Zeitraum prüfen. Wenn der Durchschnitt unter dem Mindestwert liegt, den wir zum Herunterfahren und Ausführen des Skripts als Dienst benötigen, ist dies ein Wenn Sie das Problem genauer angehen möchten, kann ich Ihnen gerne dabei helfen.

Kopieren und die folgenden Code in eine Datei in einem Verzeichnis Ihrer Wahl auf Ihrem Computer, beispielsweise einfügen i_speed.sh , dann, sehr wichtig ist , macht die Datei ausführbar , das von der Kommandozeile tun, wenn Sie Ihre Datei i_speed.sh genannt wurde wie folgt:

    chmod +x i_speed.sh 

Jetzt können Sie sudo -i als root-Datei verwenden und Ihren Cronjob so einrichten, dass das Skript in von Ihnen gewünschten Zeitintervallen aufgerufen wird.

Code zum Kopieren und Einfügen in eine Datei namens 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

AKTUALISIEREN

Ich habe ein kleines Python-Programm als Aktualisierung des obigen Bash-Skripts geschrieben, mit dem Sie zusätzliche Variablen wie Wiederholungen und Intervalle festlegen können, um eine durchschnittliche Mindestgeschwindigkeit über einen bestimmten Zeitraum zu erhalten. Weitere Updates werden eine GUI für dieses Programm beinhalten. Kopieren Sie einfach den folgenden Code und fügen Sie ihn in eine Datei ein. download_monitor.pyFühren Sie ihn dann wie folgt aussudo 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()
Königsmilch
quelle
VIELEN DANK! Das ist genau das, was ich wollte! Ich werde es morgen versuchen. Habe die Missus jetzt erledigt und sie möchte etwas linuxfreie Zeit ... Aber das ist das Skript, nach dem ich gesucht habe. Vielen Dank
cirkator
Hey Mann :) Entschuldigung, dass ich nicht früher geantwortet habe, aber ich habe keine Zeit gefunden, es zu testen. Aber es FUNKTIONIERT:) Ich habe etwas mehr über das Skript nachgedacht. Wäre es möglich, es so zu programmieren, dass es sich ein bisschen anders verhält? Es wäre großartig, wenn das Skript beim Start startet und dann ein kleines Fenster auf dem Desktop anzeigt, in dem steht: "Sie haben 3 Minuten Zeit, um zB" NEIN "einzugeben, wenn Sie das Skript anhalten möchten, andernfalls wird der PC heruntergefahren, wenn dies der Fall ist ist kein Netzwerkverkehr (oder unter etwas) für z. B. einen Zeitraum von 5 Minuten. "
Zirkulator
Auf diese Weise könnte ich das Skript über cron bei jedem Start starten, aber wenn ich physisch am PC bin und nicht möchte, dass das Skript ausgeführt wird, könnte ich es leicht deaktivieren. Und wenn es sich um einen geplanten Autostart handelt, der nur zum Herunterladen um 3.00 Uhr morgens stattfindet, werden 3 Minuten heruntergezählt und das Skript in den "Go and Monitor-Modus" versetzt. Ist es auch möglich, das Skript ständig laufen zu lassen und weiter zu überprüfen, oder kann ich es nur z. B. jede Minute mit cron ausführen und prüfen lassen, ob kein Netzwerkverkehr vorliegt? DANKE WIEDER DU BIST DER MANN :)
cirkator
@ cirkator Ich bin froh, dass es für dich funktioniert. Sicher, all diese Optionen sind möglich und möglicherweise der richtige Weg, dies zu tun. Ich werde gerne ein offizielles Programm schreiben, aber es wird etwas länger dauern. Sobald ich etwas an der richtigen Stelle habe, lasse ich Sie testen.
Kingmilo
Nehmen Sie sich die ganze Zeit der Welt Zeit, ich freue mich nur über den Gedanken, dass Sie in Ihrer Freizeit etwas für uns programmieren. Sehr geschätzt! :)
cirkator
2

Ich fand dieses Thema sehr hilfreich. Ohne Python-Kenntnisse habe ich das obige Skript aktualisiert, um die durchschnittliche Netzwerkgeschwindigkeit zu ermitteln und in den Energiesparmodus zu wechseln, wenn die durchschnittliche Geschwindigkeit über der Mindestgeschwindigkeit liegt. Nach langem Schlaf werden die Berechnungen zurückgesetzt und die Durchschnittsgeschwindigkeit erneut berechnet.

## 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
quelle