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.py
a 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()