无网络流量时关闭系统的工具

无网络流量时关闭系统的工具

我正在寻找一个脚本或工具,可以在需要时打开它,如果例如 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()

相关内容