我正在寻找一个脚本或工具,可以在需要时打开它,如果例如 10 分钟内没有网络流量或低于 100kb,它就会关闭我的计算机。
自动下载真的很方便。我知道这样做有缺点,互联网连接会挂起,下载程序也会挂起,所以如果你有更好的主意,请告诉我。
提前致谢。
答案1
有几种方法可以解决这个问题,我写了一个非常简单的 bash 脚本,你可以用它来监控每秒千字节数对于期望的接口,当下载当速度低于最低值(您可以设置)时,您的计算机将会关闭。
需要注意的事项如下:
这是我快速编写的 bash 脚本,有很多不同的技术可以实现相同的结果,但这个脚本很容易理解和实现。
您需要从执行 bash 脚本以 root 身份执行 cron,这意味着您需要以 root 用户身份打开 cron 并根据需要添加 cronjob。它需要位于 root 的 cron 中的原因是,如果您不是 root 用户,您将无法从命令行关闭计算机,并且当您离开键盘时您无法使用 sudo。有办法解决这个问题,但我试图让它尽可能简单。
我使用一个名为状态统计,因此您需要安装它,否则脚本将无法运行:
sudo apt-get install ifstat
下面的脚本中有两个选项可以修改,界面和最小速度。INTERFACE 需要设置为您用于下载的接口,有线设备为 eth0,无线设备为 wlan0,您可以使用命令是否配置从命令行查看您有哪些可用的接口。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()
答案2
我发现这个主题非常有用。在没有任何 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()