Có một vài cách để giải quyết vấn đề này, tôi đã viết một tập lệnh bash rất đơn giản mà bạn có thể sử dụng để theo dõi tốc độ tính bằng KB cho giao diện mong muốn, khi tốc độ tải xuống giảm xuống dưới mức tối thiểu (bạn có thể đặt) , sau đó máy tính của bạn sẽ được tắt máy.
Một số điều cần ghi nhớ ở đây là:
Đây là một kịch bản bash mà tôi kết hợp nhanh chóng, có nhiều kỹ thuật khác nhau để đạt được cùng một kết quả, tuy nhiên đây là một kịch bản dễ hiểu và dễ thực hiện.
Bạn sẽ cần phải thực thi tập lệnh bash từ cron là root , điều đó có nghĩa là bạn cần mở cron với tư cách là người dùng root và thêm một cronjob như mong muốn. Lý do cần có trong cron của root là bạn sẽ không thể tắt máy tính của mình khỏi dòng lệnh mà không cần root và bạn không thể sử dụng sudo khi bạn rời khỏi bàn phím. Có nhiều cách để khắc phục nó nhưng tôi đang cố gắng giữ nó đơn giản nhất có thể.
Tôi sử dụng một công cụ linux có tên ifstat , vì vậy bạn sẽ cần cài đặt cái này nếu không đoạn script sẽ không hoạt động:
sudo apt-get install ifstat
Có 2 tùy chọn mà bạn có thể sửa đổi trong tập lệnh bên dưới, đó là INTERFACE và MINinksEED . INTERFACE cần được đặt thành giao diện bạn đang sử dụng để tải xuống, eth0 cho thiết bị có dây hoặc wlan0 cho thiết bị không dây của bạn, bạn có thể sử dụng lệnh ifconfig từ dòng lệnh để xem giao diện nào bạn có sẵn. MINinksEED được đặt như mong muốn, trong ví dụ của tôi, tôi đặt nó thành số 5 , có nghĩa là nếu tốc độ tải xuống của tôi dưới 5 KB mỗi giây thì máy tính của tôi sẽ tắt.
Cuối cùng, để cải thiện tập lệnh, chúng tôi có thể sử dụng vòng lặp while và kiểm tra tốc độ tải xuống trong một khoảng thời gian xác định và nếu trung bình nhỏ hơn mức tối thiểu, chúng tôi sẽ tắt máy, cũng như chạy tập lệnh dưới dạng dịch vụ, đây là một cách tiếp cận vấn đề chính xác hơn và tôi sẽ sẵn lòng giúp bạn với điều đó nếu đây là con đường bạn muốn đi theo.
Sao chép và dán mã dưới đây vào một tệp trong thư mục bạn chọn trên máy tính của mình, ví dụ i_speed.sh , sau đó, rất quan trọng, làm cho tệp có thể thực thi được , để thực hiện điều này từ dòng lệnh, nếu tệp của bạn được gọi là i_speed.sh như sau:
chmod +x i_speed.sh
Bây giờ bạn có thể sudo -i để root và thiết lập cronjob của bạn để gọi tập lệnh theo các khoảng thời gian mà bạn mong muốn.
Mã để sao chép và dán vào một tệp có tên 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
CẬP NHẬT
Tôi đã viết một chương trình python nhỏ dưới dạng cập nhật cho tập lệnh bash ở trên, cho phép bạn đặt các biến bổ sung như thử lại và khoảng thời gian để có tốc độ tối thiểu trung bình trong một khoảng thời gian xác định. Cập nhật thêm sẽ bao gồm một GUI cho chương trình này. Chỉ cần sao chép và dán mã dưới đây vào một tệp, ví dụ download_monitor.py
sau đó chạy nó như sausudo 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()