Herramienta para apagar el sistema cuando no hay tráfico de red

13

Estoy buscando un script o una herramienta que pueda activar, cuando sea necesario, que apague mi computadora si, por ejemplo, no hay tráfico de red durante, por ejemplo, 10 minutos o, por ejemplo, menos de 100 kb.

Sería realmente útil para la descarga automática. Sé que hay inconvenientes en esto, la conexión a Internet está suspendida, el programa de descarga está suspendido, así que si tienes una mejor idea, dímelo.

Gracias por adelantado.

cirkator
fuente

Respuestas:

15

Hay algunas maneras de hacerlo, he escrito un script bash muy simple que puede usar para monitorear la velocidad en KB p / s para una interfaz deseada, cuando la velocidad de descarga cae por debajo del mínimo (que puede establecer) , entonces tu computadora se apagará.

Algunas cosas a tener en cuenta aquí son:

  • Este es un script bash que preparé rápidamente, hay muchas técnicas diferentes para lograr el mismo resultado, sin embargo, es fácil de entender e implementar.

  • Deberá ejecutar el script bash desde cron como root , lo que significa que debe abrir cron como usuario root y agregar un cronjob como lo desee. La razón por la que debe estar en el cron de root es que no podrá apagar su computadora desde la línea de comandos sin ser root, y no puede usar sudo mientras esté lejos del teclado. Hay formas de evitarlo, pero estoy tratando de mantenerlo lo más simple posible.

  • Utilizo una herramienta de Linux llamada ifstat , por lo que deberá instalarla; de lo contrario, el script no funcionará:

    sudo apt-get install ifstat
    
  • Hay 2 opciones que puede modificar en el siguiente script, INTERFACE y MIN_SPEED . La INTERFAZ debe configurarse en la interfaz que está utilizando para descargar, ya sea eth0 para su dispositivo con cable o wlan0 para su dispositivo inalámbrico, puede usar el comando ifconfig desde la línea de comandos para ver qué interfaces tiene disponibles. MIN_SPEED se configura como se desea, en mi ejemplo lo configuré en el número 5 , lo que significa que si mi velocidad de descarga es inferior a 5 KB por segundo , mi computadora se apagará.

  • Por último, para mejorar el script, podríamos usar un ciclo while y verificar la velocidad de descarga durante un período de tiempo específico y, si el promedio es menor que el mínimo, cerraríamos, además de ejecutar el script como servicio, este es un Una forma más precisa de abordar el problema y estaré encantado de ayudarlo con eso si esta es la ruta que le gustaría seguir.

Copie y pegue el código siguiente en un archivo en un directorio de su elección en su computadora, por ejemplo i_speed.sh , luego, muy importante, haga que el archivo sea ejecutable , para hacerlo desde la línea de comandos, si su archivo se llamó i_speed.sh como sigue:

    chmod +x i_speed.sh 

Ahora puede sudo -i para rootear y configurar su cronjob para llamar al script en los intervalos de tiempo que desee.

Código para copiar y pegar en un archivo llamado 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

ACTUALIZAR

Escribí un pequeño programa de Python como una actualización del script bash anterior que le permite establecer variables adicionales como reintentos e intervalos para obtener una velocidad mínima promedio durante un período de tiempo específico. Las actualizaciones adicionales incluirán una GUI para este programa. Simplemente copie y pegue el siguiente código en un archivo, por ejemplo download_monitor.py, ejecútelo de la siguiente manerasudo 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
fuente
¡GRACIAS! Eso es exactamente lo que quería! Intentaré esto mañana, terminé con la señora ahora y ella quiere un poco de tiempo libre de Linux ... Pero ese es el guión que estaba buscando. Gracias
cirkator
Hola hombre:) lamento no haber respondido antes, pero no encontré tiempo para probarlo. Pero está FUNCIONANDO:) Pensé un poco más sobre el script, ¿sería posible programarlo para que se comportara un poco diferente? Sería genial si el script comienza al inicio, luego muestra una pequeña ventana en el escritorio, que dice: "Tiene 3 minutos para ingresar, por ejemplo," NO "si desea detener el script, de lo contrario, se cerrará la PC si hay no hay tráfico de red (o debajo de algo) durante, por ejemplo, un período de 5 minutos ".
cirkator
De esta manera, podría iniciar el script a través de cron en cada inicio, pero si estoy físicamente en la PC y no quiero que el script se ejecute, podría deshabilitarlo fácilmente. Y si se trata de un inicio automático programado, digamos a las 3.am solo para descargar, contará 3 minutos y luego configurará el script en "Ir y modo monitor". Además, ¿es posible tener el script ejecutándose todo el tiempo y seguir comprobando o solo puedo ejecutarlo, por ejemplo, cada minuto con cron y dejar que verifique si no hay tráfico de red? GRACIAS DE NUEVO ERES EL HOMBRE :)
cirkator
@cirkator, me alegro de que funcione para ti. Claro, todas esas opciones son posibles y posiblemente la forma correcta de hacerlo. Estaré encantado de escribir un programa más oficial, pero tomará un poco más de tiempo. Una vez que tenga algo en su lugar, te dejaré probar.
kingmilo
Tómese todo el tiempo del mundo, estoy feliz de pensar que está codificando algo para nosotros en su tiempo libre. ¡Muy apreciado! :)
cirkator
3

Encontré este tema muy útil. Sin conocimiento de Python, actualicé el script anterior para obtener la velocidad promedio de la red y entrar en modo de suspensión prolongada si la velocidad promedio es mayor que la velocidad mínima. Después de reiniciar los cálculos de sueño prolongado, se calcula nuevamente la velocidad promedio.

## 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()
usuario3215145
fuente
Increíble. Esto significa que este cronjob debe iniciarse solo una vez, ¿verdad?
Ben