Answers:
有几种解决方法,我编写了一个非常简单的bash脚本,当下载速度降至最低(您可以设置)以下时,可用于监视所需接口的KB p / s速度。 ,则您的计算机将关闭。
这里要记住的一些事情是:
这是我快速整理的bash脚本,有很多不同的技术可以实现相同的结果,但这是一种易于理解和实现的方法。
您将需要以root用户身份从cron执行bash脚本,这意味着您需要以root用户身份打开cron并根据需要添加cronjob。它需要位于root用户的cron中的原因是,如果没有root用户,则无法从命令行关闭计算机,并且在远离键盘时无法使用sudo。有很多方法可以解决它,但我正在尝试使其尽可能简单。
我使用一个名为ifstat的linux工具,因此您需要安装此工具,否则脚本将无法工作:
sudo apt-get install ifstat
您可以在下面的脚本中修改两个选项,即INTERFACE和MIN_SPEED。需要将接口设置为您要下载的接口,有线设备为eth0或无线设备为wlan0,您可以从命令行使用命令ifconfig查看可用的接口。MIN_SPEED根据需要设置,在我的示例中,将其设置为5,这意味着如果我的下载速度低于每秒5 KB,则我的计算机将关闭。
最后,为了改进脚本,我们可以使用while循环并检查指定时间段内的下载速度,如果平均值小于我们将关闭的最小值,以及将脚本作为服务运行,这是一个更准确地解决问题的方法,如果您愿意遵循这条路线,我们将很乐意为您提供帮助。
将以下代码复制并粘贴到计算机上您选择的目录中的文件中,例如i_speed.sh,然后,非常重要的是,使该文件成为可执行文件,如果您的文件名为i_speed.sh,则可以从命令行执行此操作如下:
chmod +x i_speed.sh
现在,您可以sudo -i以root身份设置您的cronjob并设置为在您希望的时间间隔调用脚本。
复制并粘贴到名为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
更新
我写了一个小python程序作为上述bash脚本的更新,它允许您设置其他变量,例如重试和时间间隔,以在指定的时间段内获得平均最低速度。进一步的更新将包括此程序的GUI。只需将下面的代码复制并粘贴到文件中,download_monitor.py
然后按如下所示运行它即可sudo 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()
我发现此主题非常有帮助。在没有Python知识的情况下,我已经更新了上面的脚本以获取平均网络速度,并且如果平均速度大于最小速度,则将进入长时间睡眠状态。经过长时间的睡眠计算后,将重置并重新计算平均速度。
## 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()