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

13

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

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

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

cirkator
источник

Ответы:

15

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

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

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

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

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

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

  • Наконец, чтобы улучшить сценарий, мы могли бы использовать цикл 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-скрипта, который позволяет вам устанавливать дополнительные переменные, такие как повторные попытки и интервал, чтобы получить среднюю минимальную скорость за указанный период времени. Дальнейшие обновления будут включать графический интерфейс для этой программы. Просто скопируйте и вставьте приведенный ниже код в файл, например, 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()
kingmilo
источник
БЛАГОДАРНОСТЬ! Это именно то, что я хотел! Я попробую это завтра, прямо сейчас, миссис, и она хочет немного свободного времени ... Но это сценарий, который я искал. Спасибо
Cirkator
Эй, чувак:) Извините, что я не ответил ранее, но я не нашел времени, чтобы проверить это. Но это РАБОТАЕТ :) Я еще немного подумал о скрипте, можно ли его запрограммировать так, чтобы он вел себя немного иначе? Было бы замечательно, если скрипт запускается при запуске, а затем показывает небольшое окно на рабочем столе, которое гласит: «У вас есть 3 минуты для ввода, например,« НЕТ », если вы хотите остановить скрипт, в противном случае он выключит компьютер, если есть нет сетевого трафика (или чего-то ниже), например, в течение 5 минут. "
Циркатор
Таким образом, я мог запускать скрипт через cron при каждом запуске, но если я физически на ПК и не хочу, чтобы скрипт запускался, я мог бы легко отключить его. И если это запланированный автозапуск, скажем, в 3.am только для загрузки, он будет отсчитывать 3 минуты, а затем переводит скрипт в «Go and monitor-mode». Также возможно ли, чтобы скрипт работал постоянно и продолжал проверять, или я могу только запускать его, например, каждую минуту с помощью cron и разрешать ему проверять отсутствие сетевого трафика? СПАСИБО ВНОВЬ,
ЧТО
@cirkator Я рад, что это работает на тебя. Конечно, все эти варианты возможны и, возможно, правильный способ сделать это. Я буду рад написать более официальную программу, но это займет немного больше времени. Как только у меня будет что-то на месте, я дам вам проверить.
kingmilo
Потратьте все время в мире, я просто счастлив от мысли, что вы что-то кодируете для нас в свое свободное время. Очень ценится! :)
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()
user3215145
источник
Потрясающие. Так что это означает, что этот cronjob должен быть запущен только один раз, верно?
Бен