Інструмент для відключення системи, коли немає мережевого трафіку


13

Я шукаю сценарій або інструмент, який можна включити, коли це потрібно, який вимикає мій комп'ютер, якщо немає, наприклад, мережевого трафіку, наприклад, 10 хвилин або нижче 100 кбіт.

Було б дуже зручно для автоматичного завантаження. Я знаю, що в цьому є мінуси, підключення до Інтернету висить, програма для завантаження висить, тому якщо у вас є краща ідея, будь ласка, скажіть мені.

Заздалегідь спасибі.

Відповіді:


15

Є кілька способів зробити це, я написав дуже простий скрипт bash, який ви можете використовувати для контролю швидкості в кб / с для потрібного інтерфейсу, коли швидкість завантаження опускається нижче мінімальної (яку ви можете встановити) , тоді ваш комп'ютер буде відключений.

Тут слід пам’ятати:

  • Це базовий сценарій, який я швидко зібрав, є багато різних технік для досягнення того ж результату, однак це легко зрозуміти та реалізувати.

  • Вам потрібно буде виконати скрипт bash з cron як root , це означає, що вам потрібно відкрити cron як користувач root та додати cronjob за бажанням. Причина, в якій він повинен бути в корені кореня, полягає в тому, що ви не зможете вимкнути комп'ютер з командного рядка, не використовуючи root, і ви не можете використовувати sudo, перебуваючи далеко від клавіатури. Є способи її обійти, але я намагаюся зробити це максимально просто.

  • Я використовую інструмент Linux під назвою ifstat , тому вам потрібно буде встановити це, інакше сценарій не буде працювати:

    sudo apt-get install ifstat
    
  • Є два варіанти, які ви можете змінити в нижченаведеному сценарії, INTERFACE та MIN_SPEED . INTERFACE потрібно встановити на інтерфейс, який ви використовуєте для завантаження, або eth0 для вашого провідного пристрою, або wlan0 для вашого бездротового пристрою, ви можете використовувати команду ifconfig з командного рядка, щоб побачити, які інтерфейси у вас є. MIN_SPEED встановлюється за бажанням, у моєму прикладі я встановив його на число 5 , а це означає, що якщо швидкість завантаження менша за 5 Кб в секунду, то мій комп'ютер вимкнеться.

  • Нарешті, для вдосконалення сценарію ми могли б скористатися циклом часу та перевірити швидкість завантаження протягом визначеного періоду часу, і якщо середнє значення буде меншим від мінімального, ми б відключились, а також запустили сценарій як сервіс, це Більш точний спосіб вирішити проблему, і я з радістю допоможу вам у цьому, якщо це маршрут, який ви хотіли б пройти.

Скопіюйте і вставте наведений нижче код у файл у вибраному вами каталозі на своєму комп’ютері, наприклад, i_speed.sh , тоді дуже важливо зробити файл виконуваним , щоб це зробити з командного рядка, якщо ваш файл називався i_speed.sh наступним чином:

    chmod +x i_speed.sh 

Тепер ви можете надіслати sui -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()

СПАСИБІ! Це саме те, що я хотів! Я спробую це завтра. Отримав місію зараз, і вона хоче трохи вільного часу на Linux ... Але ось сценарій, який я шукав. Спасибі
циркатор

Гей, чоловіче:) Вибачте, що я не відповів раніше, але я не знайшов часу, щоб перевірити це. Але це РОБОТА:) Я подумав ще трохи про сценарій, чи можна було б запрограмувати його, щоб він поводився трохи інакше? Було б чудово, якщо сценарій запускається при запуску, після чого на робочому столі відображається невелике вікно, яке говорить: "У вас є 3 хвилини для введення, наприклад" НІ ", якщо ви хочете зупинити сценарій, інакше він вимкне ПК, якщо є не має мережевого трафіку (або нижче чогось), наприклад, протягом 5 хвилин. "
циркатор

Таким чином я міг запускати скрипт через cron під час кожного запуску, але якщо я фізично перебуваю на ПК, і я не хочу, щоб сценарій запускався, я міг би легко його відключити. І якщо його запланований автозапуск дозволить сказати о 3.am лише для завантаження, він би відраховував 3 хвилини, а потім встановив сценарій у "Перейти та монітор-режим". Чи можливо, щоб сценарій працював увесь час, і продовжувати перевіряти, чи можу я запускати його лише, наприклад, щохвилини за допомогою 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()

Дивовижно. Отже, це означає, що цю роботу можна розпочати лише один раз, правда?
Бен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.