Ferramenta para desligar o sistema quando não há tráfego de rede

13

Estou procurando um script ou uma ferramenta que eu possa ativar, quando necessário, que desligue meu computador se houver, por exemplo. sem tráfego de rede por, digamos, 10 minutos, ou abaixo de 100kb, por exemplo.

Seria realmente útil para o download automático. Eu sei que há desvantagens para isso, conexão com a internet está pendente, o programa de download está pendurado, então se você tiver uma idéia melhor, por favor me diga.

Obrigado antecipadamente.

    
por cirkator 19.02.2012 / 10:13

2 respostas

14

Existem algumas maneiras de fazer isso, eu escrevi um script muito simples que você pode usar para monitorar a velocidade em KB p / s por um interface desejada, quando a velocidade de download cair abaixo do mínimo (que você pode definir), o seu computador será desligado.

Algumas coisas que você deve ter em mente são:

  • Este é um script bash que eu reuni rapidamente, existem muitas técnicas diferentes para alcançar o mesmo resultado, no entanto, é fácil de entender e implementar.

  • Você precisará executar o script bash de cron como root , o que significa que você precisa abrir o cron como usuário root e adicionar um cronjob conforme desejado . A razão pela qual ele precisa estar no cron do root é que você não será capaz de desligar o seu computador a partir da linha de comando sem ser o root, e você não pode usar o sudo enquanto estiver longe do teclado. Há maneiras de contornar isso, mas estou tentando mantê-lo o mais simples possível.

  • Eu uso uma ferramenta do Linux chamada ifstat , portanto, você precisará instalar isso, caso contrário, o script não funcionará:

    sudo apt-get install ifstat
    
  • Existem 2 opções que você pode modificar no script abaixo, a INTERFACE e MIN_SPEED . A INTERFACE precisa ser definida para a interface que você está usando para download, seja eth0 para seu dispositivo com fio ou wlan0 para seu dispositivo sem fio, você pode usar o comando ifconfig a partir do linha de comando para ver quais interfaces você tem disponíveis. O MIN_SPEED está definido como desejado, no meu exemplo eu o configurei para o número 5 , o que significa que se a minha velocidade de download for menor que 5 KB por segundo , meu computador desligamento.

  • Por último, para melhorar o script, poderíamos usar um while loop e verificar a velocidade de download em um período de tempo especificado e se a média é menor do que o mínimo que desligaríamos, assim como executar o script como um serviço, essa é uma maneira mais precisa de abordar o problema e ficaremos felizes em ajudá-lo se essa for a rota que você gostaria de seguir.

Copie e cole o código abaixo em um arquivo em um diretório de sua escolha em seu computador, exemplo i_speed.sh , então, muito importante, torne o arquivo executável , para fazer isso a partir da linha de comando, se o seu arquivo foi chamado i_speed.sh da seguinte forma:

    chmod +x i_speed.sh 

Agora você pode sudo -i para fazer o root e configurar seu cronjob para chamar o script em intervalos de tempo que você deseja.

Código para copiar e colar em um arquivo chamado 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 }' | sed -n '3p''
INT=${CURRENT_SPEED/\.*}

if [ $INT -lt $MIN_SPEED ]; then
    shutdown -h now
else
    exit
fi

UPDATE

Eu escrevi um pequeno programa python como uma atualização para o script bash acima, que permite que você defina variáveis adicionais, como novas tentativas e intervalos, para obter uma velocidade mínima média em um período de tempo especificado. Atualizações adicionais incluirão uma GUI para este programa. Basta copiar e colar o código abaixo em um arquivo, por exemplo, download_monitor.py e executá-lo da seguinte forma: 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 }' | 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()
    
por kingmilo 19.02.2012 / 14:18
2

Eu achei este tópico muito útil. Sem conhecimento em Python, atualizei o script acima para obter a velocidade média da rede e durmo muito se a velocidade média for maior que a velocidade mínima. Depois de longos períodos de sono, os cálculos são redefinidos e a velocidade média é calculada novamente.

## 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 } use just downstream
        # {print } use just upstream
        # {print +} use sum of downstream and upstream
        SPEED += int(float(getoutput("ifstat -i %s 1 1 | awk '{print +}' | 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()
    
por user3215145 14.06.2017 / 00:15