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

Проблема была решена путем запуска sudo apt install libxkbcommon-x11-0 в Terminal для установки отсутствующей зависимости.

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

Надеюсь, это поможет другим с той же проблемой в будущем.

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

2 ответа

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

KB p / s

Это сценарий bash, который я собрал быстро, есть много различные методы для достижения одного и того же результата, однако это легко понять и реализовать. Вам нужно будет выполнить скрипт bash из cron как root, это означает, что вам нужно открыть cron в качестве пользователя root и добавить желаемый cronjob. Причина, по которой он должен быть в корневом каталоге cron, заключается в том, что вы не сможете завершить работу своего компьютера из командной строки, не будучи root, и вы не можете использовать sudo, пока вы находитесь вне клавиатуры. Есть способы обойти это, но я стараюсь держать его как можно проще. Я использую инструмент linux под названием ifstat, поэтому вам нужно будет установить это, иначе скрипт не будет работать:
sudo apt-get install ifstat
Есть два варианта, которые вы можете изменить в следующем скрипте: INTERFACE и 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, чтобы вызвать скрипт с необходимыми временными интервалами. [!d32 ]

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

UPDATE

Я написал небольшую программу 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()
14
ответ дан 25 May 2018 в 14:08
  • 1
    БЛАГОДАРЯ! Это именно то, что я хотел! Я попробую это завтра, Получил миссус прямо сейчас, и она хочет какое-то время без linux. Но это тот сценарий, который я искал. благодаря – cirkator 20 February 2012 в 00:10
  • 2
    Эй, мужчина:) Извините, что я не ответил раньше, но я не нашел времени, чтобы проверить его. Но это РАБОТАЕТ:) Я подумал о скрипте, можно ли запрограммировать его так, чтобы он немного отличался? Было бы здорово, если скрипт запустится при запуске, а затем отобразит небольшое окно на рабочем столе, в котором говорится: «У вас есть 3 минуты для входа, например. & Quot; НЕТ & Quot; если вы хотите остановить скрипт, в противном случае он выключит компьютер, если нет сетевого трафика (или что-то ниже), например. период 5 минут. " – cirkator 25 February 2012 в 15:48
  • 3
    Таким образом, я мог бы запустить скрипт через cron при каждом запуске, но если я физически на компьютере, и я не хочу, чтобы скрипт работал, я мог бы легко отключить его. И если его запланированный автозапуск позволяет говорить в 3.a.m. просто для загрузки, он будет отсчитывать 3 минуты, а затем установить сценарий в «Go и monitor-mode». Также возможно, что скрипт работает все время, и продолжать проверять или я могу запустить его, например. каждую минуту с помощью cron и пусть он не проверяет сетевой трафик? СПАСИБО СНОВА ТЫ МУЖЧИНА :) – cirkator 25 February 2012 в 15:55
  • 4
    @cirkator Я рад, что он работает на вас. Конечно, все эти варианты возможны и, возможно, правильный способ сделать это. Я буду рад написать более официальную программу, но это займет немного больше времени. Как только у меня есть что-то на месте, я дам вам пройти тест. – kingmilo 26 February 2012 в 02:59
  • 5
    Возьмите все время в мире, я просто рад мысли, что вы что-то кодируете для нас в свободное время. Очень ценим! :) – cirkator 28 February 2012 в 04:25

Я нашел эту тему очень полезной. Без знания 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()
2
ответ дан 25 May 2018 в 14:08

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

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