Andrés Blog

Krams. Und so.

Dez 28, 2015

Das System automatisch herunterfahren, sobald alle Downloads abgeschlossen sind

Ich bin über die Feiertage und den Jahreswechsel bei meinen Eltern. Dort ist die Internetleitung nicht so breitbandig, wie ich es zuhause gewohnt bin. Da gerade der 32c3 läuft und ich mir ein paar der Talks gerne ansehen möchte, stößt die Leitung bei den Downloads der Aufzeichnungen schnell an ihre Grenze - zumal ich nicht der alleinige Nutzer bin. Daher habe ich ein kleines Script geschrieben, welches den Rechner nach (hoffentlich erfolgreichem) Download automatisch in den Ruhezustand schickt. So kann der Download über Nacht laufen und der Rechner ist nicht länger an, als benötigt. Dazu wird alle paar Sekunden der Traffic einer Netzwerkschnittstelle ausgelesen und wenn dieser unter einen Schwellwert sinkt, dann wird ein definierter Befehl ausgeführt. So muss man nicht von vornherein die Downloads genau planen, sondern legt einfach los ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

function networkidle() {
    local device=enp4s0
    local traffic_last=$(grep $device /proc/net/dev | awk '{print $2}')
    local framesize=5
    local traffic_min=20
    local shutdowncommand="systemctl suspend"

    while true; do
        sleep $framesize
        traffic_now=$(grep $device /proc/net/dev | awk '{print $2}')
        traffic_diff=$(expr ${traffic_now} - ${traffic_last})
        traffic_diff=$(expr ${traffic_diff} / 1024)
        traffic_persec=$(expr ${traffic_diff} / $framesize)
        traffic_last=$traffic_now
        echo $traffic_diff kb in $framesize seconds ~ $traffic_persec kb/s
        if [[ $traffic_persec -lt $traffic_min ]];
        then
            echo "Traffic below ${traffic_min} kb/s. Suspending!"
            $shutdowncommand
            return
        fi
    done
}

networkidle