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


13

我正在寻找可以在需要时打开的脚本或工具,例如,如果说例如10分钟之内没有网络流量,或者例如低于100kb,则关闭计算机。

自动下载将非常方便。我知道这样做有弊端,互联网连接正在挂起,下载程序正在挂起,所以如果您有更好的主意,请告诉我。

提前致谢。

Answers:


15

有几种解决方法,我编写了一个非常简单的bash脚本,当下载速度降至最低(您可以设置)以下时,可用于监视所需接口的KB p / s速度。 ,则您的计算机将关闭。

这里要记住的一些事情是:

  • 这是我快速整理的bash脚本,有很多不同的技术可以实现相同的结果,但这是一种易于理解和实现的方法。

  • 您将需要以root用户身份从cron执行bash脚本,这意味着您需要以root用户身份打开cron并根据需要添加cronjob。它需要位于root用户的cron中的原因是,如果没有root用户,则无法从命令行关闭计算机,并且在远离键盘时无法使用sudo。有很多方法可以解决它,但我正在尝试使其尽可能简单。

  • 我使用一个名为ifstat的linux工具,因此您需要安装此工具,否则脚本将无法工作:

    sudo apt-get install ifstat
    
  • 您可以在下面的脚本中修改两个选项,即INTERFACEMIN_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()

谢谢!那正是我想要的!我明天试试看,现在错过了,她想要一些linuxfree的时间...但这就是我想要的脚本。谢谢
cirkator

嘿男人:)对不起,我没有早点回复,但是我没有时间测试它。但这是工作的:)我对脚本有更多了解,是否可以对其进行编程,使其行为有所不同?如果脚本在启动时启动,然后在桌面上显示一个小窗口,那会很棒,它说:“如果要停止脚本,您有3分钟的时间输入,例如“否”,否则如果存在则将关闭计算机例如在5分钟内没有网络流量(或低于某个流量)。”
cirkator

这样,我可以在每次启动时通过cron启动脚本,但是如果我实际在PC上并且我不希望脚本运行,则可以轻松禁用它。如果安排好的自动启动时间是在凌晨3点说只是为了下载,它将倒数3分钟,然后将脚本设置为“转到并监视模式”。还有可能让脚本一直运行,并继续检查吗?或者我只能例如使用cron每分钟运行一次,让它检查是否没有网络流量?再次感谢您是男人:)
cirkator 2012年

@cirkator我很高兴为您工作。当然,所有这些选择都是可能的,并且可能是正确的选择方式。我很乐意编写一个更正式的程序,但是会花一些时间。一旦我准备好了东西,我会让你测试。
kingmilo 2012年

花费世界上的所有时间,我很高兴您在空闲时间为我们编写一些代码。非常感谢!:)
cirkator

3

我发现此主题非常有帮助。在没有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()

太棒了 因此,这意味着该cronjob只需要启动一次,对吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.