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

13

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

Seria realmente útil para o download automático. Eu sei que há desvantagens nisso, a conexão à Internet está travada, o programa de download está travado; portanto, se você tiver uma idéia melhor, me diga.

Desde já, obrigado.

cirkator
fonte

Respostas:

15

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

Algumas coisas a ter em mente aqui são:

  • Este é um script bash que eu montei 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 a partir do 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 poderá desligar o computador da linha de comando sem ser o root e não poderá usar o sudo enquanto estiver longe do teclado. Existem maneiras de contornar isso, mas estou tentando mantê-lo o mais simples possível.

  • Eu uso uma ferramenta Linux chamada ifstat , então 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, INTERFACE e MIN_SPEED . O INTERFACE precisa ser definido como a interface que você está usando para fazer o download, eth0 para seu dispositivo com fio ou wlan0 para seu dispositivo sem fio, você pode usar o comando ifconfig na linha de comando para ver quais interfaces você tem disponível. O MIN_SPEED está definido como desejado, no meu exemplo, defino-o como número 5 , o que significa que, se a velocidade de download for menor que 5 KB por segundo , o computador será desligado.

  • Por fim, para melhorar o script, poderíamos usar um loop while e verificar a velocidade do download durante um período de tempo especificado. Se a média for menor que a mínima, desligaríamos e executaríamos o script como um serviço. maneira mais precisa de abordar o problema e terei prazer em ajudá-lo, caso seja esse o caminho que você deseja seguir.

Copie e cole o código abaixo em um arquivo em um diretório de sua escolha no seu computador, por exemplo, i_speed.sh e, muito importante, torne o arquivo executável , para fazer isso na linha de comando, se o arquivo for chamado i_speed.sh do seguinte modo:

    chmod +x i_speed.sh 

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

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 $1}' | sed -n '3p'`
INT=${CURRENT_SPEED/\.*}

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

ATUALIZAR

Eu escrevi um pequeno programa python como uma atualização para o script bash acima, que permite definir variáveis ​​adicionais, como novas tentativas e intervalos, para obter uma velocidade mínima média durante um período especificado. Atualizações adicionais incluirão uma GUI para este programa. Apenas copie e cole o código abaixo em um arquivo, por exemplo download_monitor.py, execute-o da seguinte maneirasudo 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
fonte
OBRIGADO! Isso é exatamente o que eu queria! Vou tentar isso amanhã. Acabei com a senhora agora e ela quer um tempo sem linux ... Mas esse é o script que eu estava procurando. Obrigado
cirkator
Ei cara:) desculpe por não ter respondido mais cedo, mas não encontrei tempo para testá-lo. Mas está FUNCIONANDO :) Pensei um pouco mais sobre o script, seria possível programá-lo para que se comporte um pouco diferente? Seria ótimo se o script iniciar na inicialização e mostrar uma pequena janela na área de trabalho, que diz: "Você tem 3 minutos para inserir, por exemplo," NÃO "se quiser parar o script, caso contrário, desligará o PC se houver não há tráfego de rede (ou abaixo de algo) por, por exemplo, um período de 5 minutos. "
cirkator
Dessa forma, eu poderia iniciar o script via cron em todas as inicializações, mas se eu estiver fisicamente no PC e não quiser que o script seja executado eu poderia desativá-lo facilmente. E, se for uma inicialização automática agendada, digamos às 3h da manhã apenas para o download, ele contará 3 minutos e depois definirá o script em "Ir e modo de monitor". Também é possível ter o script em execução o tempo todo e continuar verificando ou posso executá-lo apenas, por exemplo, a cada minuto com o cron e deixá-lo verificar se não há tráfego na rede? Obrigado novamente você é o homem :)
cirkator
@ circirator Estou feliz que está trabalhando para você. Claro, todas essas opções são possíveis e possivelmente a maneira correta de fazê-lo. Ficarei feliz em escrever um programa mais oficial, mas levará um pouco mais de tempo. Depois que eu tiver algo no lugar, deixarei você testar.
kingmilo 25/02
Aproveite o tempo todo no mundo, estou feliz com o pensamento de que você está codificando algo para nós em seu tempo livre. Muito apreciado! :)
cirkator
3

Achei este tópico muito útil. Sem conhecimento de Python, atualizei o script acima para obter a velocidade média da rede e adormecer se a velocidade média for maior que a velocidade mínima. Após 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 $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
fonte
Impressionante. Então isso significa que este cronjob deve ser iniciado apenas uma vez, certo?
Ben