Инструмент для отключения системы при отсутствии сетевого трафика

Я ищу сценарий или инструмент, который я могу включить, когда это необходимо, который выключает мой компьютер, например, если он есть. например, нет сетевого трафика, скажем, 10 минут или ниже 100 КБ.

Было бы очень удобно для автоматической загрузки. Я знаю, что в этом есть и недостатки, интернет-соединение зависает, загружается программа загрузки, поэтому, если у вас есть идея получше, скажите мне.

Заранее спасибо.

13
задан 19 February 2012 в 14:25

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()
0
ответ дан 19 February 2012 в 14:25

Есть несколько способов сделать это, я написал очень простой bash-скрипт, который вы можете использовать для контроля скорости в КБ п / с для нужного интерфейса , когда скорость загрузки падает ниже минимума (который вы можете установить), ваш компьютер будет выключен.

Вот некоторые вещи, о которых следует помнить:

  • Это сценарий bash, который я быстро собрал, есть много разных методов для достижения того же самого результат, однако это легко понять и реализовать.

  • Вам нужно будет выполнить скрипт bash из cron как root , это означает, что вам нужно открыть cron как пользователь root и добавить cronjob по желанию. Причина, по которой он должен быть в корне root, заключается в том, что вы не сможете выключить компьютер из командной строки, не будучи пользователем root, и вы не можете использовать sudo, находясь вдали от клавиатуры. Есть способы обойти это, но я стараюсь сделать это как можно проще.

  • Я использую инструмент Linux под названием ifstat , поэтому вам нужно будет установить его, иначе скрипт не будет работать:

    sudo apt-get install ifstat
    
  • [ 1114]

    В приведенном ниже сценарии можно изменить 2 параметра: ИНТЕРФЕЙС и MIN_SPEED . ИНТЕРФЕЙС должен быть настроен на интерфейс, который вы используете для загрузки, либо eth0 для вашего проводного устройства, либо wlan0 для вашего беспроводного устройства, вы можете использовать команду ifconfig из командной строки чтобы увидеть, какие интерфейсы у вас есть. MIN_SPEED устанавливается по желанию, в моем примере я установил его на число 5 , что означает, что если моя скорость загрузки будет меньше 5 КБ в секунду , то мой компьютер выключится. [+1121]

  • Наконец, чтобы улучшить сценарий, мы могли бы использовать цикл while и проверять скорость загрузки в течение определенного периода времени, и если среднее значение меньше, чем как минимум мы бы закрыли, а также запустили скрипт как сервис, это более точный способ решения проблемы, и я буду рад помочь вам с этим, если вы хотите следовать по этому пути.

    [ 1115]

Скопируйте и вставьте приведенный ниже код в файл в каталоге по вашему выбору на вашем компьютере, например 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, которое позволяет вам устанавливать дополнительные переменные, такие как повторные попытки и интервал, чтобы получить среднюю минимальную скорость за указанный период времени. Дальнейшие обновления будут включать графический интерфейс для этой программы. Просто скопируйте и вставьте приведенный ниже код в файл, например 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()
0
ответ дан 19 February 2012 в 14:25

Другие вопросы по тегам:

Похожие вопросы: