Narzędzie do zamykania systemu, gdy nie ma ruchu sieciowego

13

Szukam skryptu lub narzędzia, które mogę włączyć w razie potrzeby, które wyłącza mój komputer, jeśli np. Nie ma ruchu sieciowego na przykład przez 10 minut lub poniżej 100 KB.

Byłoby naprawdę przydatne do automatycznego pobierania. Wiem, że są to wady, połączenie internetowe jest zawieszone, program do pobierania zawiesza się, więc jeśli masz lepszy pomysł, powiedz mi.

Z góry dziękuję.

kirkator
źródło

Odpowiedzi:

15

Jest na to kilka sposobów, napisałem bardzo prosty skrypt bash, którego można użyć do monitorowania prędkości w KB p / s dla pożądanego interfejsu, gdy prędkość pobierania spadnie poniżej minimum (które można ustawić) , wtedy komputer zostanie wyłączony.

Oto kilka rzeczy, o których należy pamiętać:

  • Jest to skrypt bash, który szybko przygotowałem, istnieje wiele różnych technik, aby osiągnąć ten sam rezultat, jednak jest to łatwy do zrozumienia i wdrożenia.

  • Będziesz musiał wykonać skrypt bash z crona jako root , co oznacza, że ​​musisz otworzyć crona jako użytkownik root i dodać cronjob zgodnie z potrzebami. Powodem, dla którego musi znajdować się w cronie roota, jest to, że nie będziesz mógł zamknąć komputera z linii poleceń bez rootowania i nie możesz używać sudo, gdy jesteś z dala od klawiatury. Istnieją sposoby na obejście tego, ale staram się, aby było to tak proste, jak to możliwe.

  • Używam narzędzia linux o nazwie ifstat , więc będziesz musiał zainstalować to, inaczej skrypt nie będzie działał:

    sudo apt-get install ifstat
    
  • Istnieją dwie opcje, które możesz zmodyfikować w skrypcie poniżej, INTERFEJS i MIN_SPEED . INTERFEJS musi być ustawiony na interfejs, którego używasz do pobrania, albo eth0 dla twojego urządzenia przewodowego, albo wlan0 dla twojego urządzenia bezprzewodowego, możesz użyć polecenia ifconfig z wiersza poleceń, aby zobaczyć, jakie interfejsy masz dostępne. MIN_SPEED jest ustawiony zgodnie z potrzebami, w moim przykładzie ustawiłem go na liczbę 5 , co oznacza, że ​​jeśli moja prędkość pobierania jest mniejsza niż 5 KB na sekundę, to mój komputer się wyłączy.

  • Wreszcie, aby ulepszyć skrypt, możemy użyć pętli while i sprawdzić prędkość pobierania w określonym przedziale czasu, a jeśli średnia jest mniejsza niż minimum, zamknęlibyśmy, a także uruchomić skrypt jako usługę, jest to dokładniejszy sposób podejścia do problemu i chętnie Ci w tym pomogę, jeśli to jest droga, którą chciałbyś podążać.

Skopiuj i wklej poniższy kod do pliku w wybranym katalogu na komputerze, na przykład i_speed.sh , a następnie, co bardzo ważne, ustaw plik wykonywalny , aby to zrobić z wiersza poleceń, jeśli plik miał nazwę i_speed.sh następująco:

    chmod +x i_speed.sh 

Teraz możesz sudo -i zrootować i skonfigurować cronjob do wywoływania skryptu w żądanych odstępach czasu.

Kod do skopiowania i wklejenia do pliku o nazwie 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

AKTUALIZACJA

Napisałem mały program python jako aktualizację powyższego skryptu bash, który pozwala ustawić dodatkowe zmienne, takie jak próby i interwały, aby uzyskać średnią minimalną prędkość w określonym przedziale czasu. Dalsze aktualizacje będą obejmować GUI dla tego programu. Po prostu skopiuj i wklej poniższy kod do pliku, przykład, download_monitor.pya następnie uruchom go w następujący sposóbsudo 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
źródło
DZIĘKI! Właśnie tego chciałem! Spróbuję tego jutro, mam już nad tym brak, a ona chce trochę wolnego czasu na linuksa ... Ale to jest scenariusz, którego szukałem. Dzięki
kirkator,
Hej stary:) przepraszam, że nie odpowiedziałem wcześniej, ale nie znalazłem czasu, aby to przetestować. Ale to DZIAŁA :) Pomyślałem trochę więcej o skrypcie, czy można go zaprogramować, żeby zachowywał się trochę inaczej? Byłoby wspaniale, gdyby skrypt uruchomił się podczas uruchamiania, a następnie pokazuje małe okno na pulpicie, które mówi: „Masz 3 minuty na wprowadzenie, np.„ NIE ”, jeśli chcesz zatrzymać skrypt, w przeciwnym razie wyłączy komputer nie ma ruchu sieciowego (lub poniżej czegoś) przez np. okres 5 minut. ”
kirkator,
W ten sposób mogę uruchomić skrypt za pomocą crona przy każdym uruchomieniu, ale jeśli jestem fizycznie na komputerze i nie chcę, aby skrypt był uruchamiany, mógłbym go łatwo wyłączyć. A jeśli jest to zaplanowany autostart, powiedzmy o 3. rano tylko do pobrania, odlicza 3 minuty, a następnie ustawia skrypt w „Idź i monitoruj”. Czy jest również możliwe, aby skrypt działał cały czas i sprawdzał dalej, czy mogę go uruchamiać tylko np. Co minutę z cronem i pozwolić, aby sprawdzał brak ruchu sieciowego? DZIĘKUJEMY PONOWNIE, ŻE JESTEŚ MĘŻCZYZNEM :)
cirkator,
@cirkator Cieszę się, że to działa dla Ciebie. Jasne, wszystkie te opcje są możliwe i prawdopodobnie właściwy sposób na zrobienie tego. Z przyjemnością napiszę bardziej oficjalny program, ale potrwa to trochę dłużej. Kiedy już coś mam, pozwolę ci przetestować.
kingmilo,
Cały czas na świecie, cieszę się, że w wolnym czasie kodujesz coś dla nas. Bardzo mile widziane! :)
cirkator
3

Uważam ten temat za bardzo pomocny. Bez znajomości języka Python zaktualizowałem powyższy skrypt, aby uzyskać średnią prędkość sieci i przejść w tryb uśpienia, jeśli średnia prędkość jest większa niż prędkość minimalna. Po długim śnie uśpienia są resetowane i ponownie obliczana jest średnia prędkość.

## 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()
użytkownik3215145
źródło
Niesamowite. Oznacza to, że ten cronjob musi zostać uruchomiony tylko raz, prawda?
Ben