Creshal schriebman bash 🙂 Arithmetik und Tests laufen in der Shell etwas anders als in vernünftigen Sprachen.

schreibs einfach in python das ist leichter verständlich^^
  • [gelöscht]

okay... habe mich mal ein bischen in python eingelesen und ein paar kommentare dazugesetzt.

#! /usr/bin/env python
import os
import time

uploadarray=[0,0,0,0,0,0,0,0,0,0,0] #liste für die uploadraten
downloadarray=[0,0,0,0,0,0,0,0,0,0,0] #liste für die downloadraten	
tempup=0 #der gesamtdatenupload vor einer minute
tempup2=0 #der gesamtdatenupload aktuell
tempdown=0 #download vor einer minute
tempdown2=0 #download aktuell
totaltraffic=0 #gesamttraffic (up/down) der letzten zehn minuten
border=5000000 #grenzwert für traffic
shutdown=0

while true:
	
	#schiebt die werte der letzen zehn minuten eins weiter und speichert in i=0 den aktuellen wert
	for i in range(9,0,-1):
		uploadarray[i]=uploadarray[i-1]
	
	tempup2=tempup
	tempup=os.system("cat /sys/class/net/enp3s0/statistics/tx_bytes")
	uploadarray[0]=tempup-tempup2

	for i in range(9,0,-1):
		downloadarray[i]=downloadarray[i-1]
	
	tempdown2=tempdown
	tempdown=os.system("cat /sys/class/net/enp3s0/statistics/rx_bytes")
	downloadarray[0]=tempdown-tempdown2

	#speichert totaltraffic für up/down der letzten zehn minuten
	uploadarray[10]=0
	downloadarray[10]=0

	for i in range(0,10,1):
		uploadarray[10] += uploadarray[i]
		downloadarray[10] += downloadarray[i]

		
	totaltraffic=uploadarray[10]+downloadarray[10]

	print(totaltraffic)

	#überschreitet der totaltraffic nicht den grenzwert, wird der computer in 10 minuten heruntergefahren
	if totaltraffic < border:
		os.system("shutdown 10")
		shutdown=1
	#überschreitet der totaltraffic innerhalb dieser 10 minuten den grenhzwert, wird der shutdown 		#abgebrochen
	if totaltraffic > border and shutdown=1:
		os.system("shutdown -c") 
		shutdown=0
	
	time.sleep(60)

nur scheinen da fehler in der syntax. zumindest bekomme ich, sofern ich das ganze ausführen will, den fehler: kommando nicht gefunden

grüße
Wieso speicherst du eigentlich die Differenzen in dem Array, es wäre einfacher die Werte in dem Array zu speichern, der totale traffic wäre dann
download[0] - download[9] + upload[0] - upload[9]
Zwar stimmen die werte dann in den ersten 10 Minuten nicht, aber das ist ja egal da du sowieso erst nach 10 Minuten herunterfahren willst. Also so würde ich das machen, (allerdings in bash):
#!/bin/bash

iface="enp3s0"
limit=5000000

while :; do
    rx=( "$(< /sys/class/net/${iface}/statistics/rx_bytes)" ${rx[@]:0:9} )
    tx=( "$(< /sys/class/net/${iface}/statistics/tx_bytes)" ${tx[@]:0:9} )

    total=$((rx[0] - rx[9] + tx[0] - tx[9]))

    if [ $total -lt $limit ]; then
        shutdown 10
    else 
        shutdown -c 
    fi
    sleep 60
done
Den Fehler in deinem Skript sehe ich nicht, ich kann aber auch kein python.
  • [gelöscht]

Danke für das bash script.

Die Array Erstellung verstehe ich allerdings noch nicht?!

Die ersten 10 Minuten könnte ich doch abdecken, in dem ich für das Ereignis noch

&& [rx[9] != null] prüfe. Ist das richtig?

Denn nun heißt es nicht mehr shutdown 10, sondern systemctl suspend


Grüße
  • [gelöscht]

ich erstelle in /tmp nun noch eine datei, welche =1 ist, sofern sich jemand über gdm eingeloggt hat, und =0, sofern sich jemand über gdm ausloggt

demnach wäre mein gewünschtes script dann:

#!/bin/bash

iface="enp3s0"
limit=5000000

while :; do
    user="$(< /tmp/userloggedin)"
    rx=( "$(< /sys/class/net/${iface}/statistics/rx_bytes)" ${rx[@]:0:9} )
    tx=( "$(< /sys/class/net/${iface}/statistics/tx_bytes)" ${tx[@]:0:9} )

    total=$((rx[0] - rx[9] + tx[0] - tx[9]))

    if [ $total -lt $limit ] && [ $rx[9] != 0] and [$user != 1]; then
        systemctl suspend
    sleep 60
    fi
done

dann bekomme ich den fehler
./suspendifnotraffic: Zeile 13: [: Fehlende `]'
was stimmt denn nun wieder nicht?
Die ersten 10 Minuten könntest du auch abdecken indem du den Array zu Beginn erst mal mit dem Wert füllst den du beim Starten des Skripts hast, also
rx_start="$(< /sys/class/net/${iface}/statistics/rx_bytes)"
tx_start="$(< /sys/class/net/${iface}/statistics/rx_bytes)"
for i in {0..9}; do
  rx[i]=rx_start
  tx[i]=tx_start
done
while ... 
Das musst du aber eigentlich nicht machen. In den ersten 10 Minuten wird, wenn du
das nicht machst, total immer rx[0] + tx[0] sein, es wird also immer über dem
Limit liegen. Ab der 11. Minute hast du dann den tatsächlichen Traffic der
letzten 10 Minuten.

Die Zuweisung des Arrays erzeugt in jedem Durchlauf ein neues Array, der erste
Wert ist immer der aktuelle Wert, die restlichen Werte (rx[@:0:9]) sind die ersten 9 Werte
des letzten Arrays.
a.r.c.h.y schrieb dann bekomme ich den fehler
./suspendifnotraffic: Zeile 13: [: Fehlende `]'
was stimmt denn nun wieder nicht?
Du musst auf Leerzeichen achten in Shellskripts:
 
[ $rx[9] != 0 ] && [ $user != 1 ];
Der Test auf $rx[9] != 0 ist übrigens überflüssig, weil rx[9] niemals 0 sein wird.
  • [gelöscht]

vielen dank!

kein traffic kann schon auftreten, da ich das script eigentlich schon beim booten starte.

also doch erstmal das array vollmüllen 🙂
  • [gelöscht]

so... der finale script:

die lösung für das problem der ersten zehn minuten ist so simpel wie einfach 😉

#!/bin/bash

iface="enp3s0"
limit=5000000
echo 0 > /home/.userloggedin
i=0

while :; do
    user="$(< /home/.userloggedin)"
    rx=( "$(< /sys/class/net/${iface}/statistics/rx_bytes)" ${rx[@]:0:9} )
    tx=( "$(< /sys/class/net/${iface}/statistics/tx_bytes)" ${tx[@]:0:9} )


    total=$((rx[0] - rx[9] + tx[0] - tx[9]))
    
 
    if [ $total -lt $limit ] && [ $user != 1 ] && [ $i -lt 11 ]; then
        systemctl suspend
    else
	i=$((i+1))
    fi
    sleep 60
   
done

Vielen Danke! vor allem @portix !!!
Ähm, wenn
echo 0 > /home/.userloggedin
und
user="$(< /home/.userloggedin)"
ist dann nicht sowieso
 [ $user != 1 ] 
?

oder schnall ich das nur nicht?
  • [gelöscht]

Diese Bedingung ist eingebaut, um die Funktion lahmzulegen, sofern sich ein Nutzer via gdm eingeloggt hat.

Über die /etc/gdm/PostLogin/Default schreibe ich dort eine 1 rein.

Via /etc/gdm/PostSession/Default schreibt es wieder eine 0, wenn ich mich auslogge.

Was das Limit angeht, so muss ich noch mal mitloggen, wieviel Durchsatz so eine ssh-Session macht