ubuntuusers.de

Energiesparskript

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

dirkolus

Anmeldungsdatum:
17. Mai 2011

Beiträge: 2181

Wohnort: dahoam

glaskugel schrieb:

Ich verstehe noch nicht ganz, wie das mit dem Timeout abläuft bzw. warum. Wenn in meinem Beispiel 192.168.178.113 nicht mehr pingbar ist, warum kommt dann netstat zu einem anderen Ergebnis.

Netstat gibt den Status der Netzwerkverbindungen wieder. Wenn ein Rechner nicht erreichbar ist, bricht deswegen die Netzwerkverbindung nicht gleich zusammen, sondern versucht das für einige Sekunden (Minuten?) zu überbrücken, wenn die Netzwerkverbindung nicht sauber abgeschlossen wurde.

Mein Problem ist, dass ich mit load nicht weiterkomme.

Muss es unbedingt load sein? Wenn Du in das Auto_OFF Script schaust, wird auch die Aktivität verschiedener Server getestet (ja, mit ping):

IsOnline()
{
        for i in $*; do
		ping $i -c1
		if [ "$?" == "0" ]; then
		  logit PC $i is still active, auto shutdown terminated
		  return 1
		fi
        done
	return 0
}

Genauso wie die Aktivität einger Daemons (IsDamonActive()) oder sogar Programmen (IsRunning()).

178.70 ist Dein Server, 178.113 ist Dein Client, richtig? Wenn Dein Client ausgeschaltet ist, erkennt der Server das mit ping. Wenn Dein Client nur keine Musik hört mehr, dann könnte man mit ps -ef schauen, ob der DLNA daemon noch aktiv ist. Im Script kann man sich den Samba-Daemon ansehen, bei DLNA weiss ich nicht, wie man das abfragen kann, ob er noch aktiv ist, das müsstest Du testen. Alternativ kann man mit netstat auf dem Server die DLNA Verbindung kontrollieren (Kein 'Verbunden' mehr, sondern nur noch 'Listen' (oder 'lauschen' oder 'hören' in deutsch). Das dauert etwas (testen!), ist aber m.E. auch eine Aussage. Load zu checken wäre mir (wie Du auch gesehen hast) zu ungenau, genauso wie mir Netzwerkverkehr verfolgen und Bandbreiten zu berechnen zu kompliziert wäre. Einfache Kommandos sind hier besser, sie sollten schnell ein belastbares Ergebnis liefern, sonst dauert die Abfrage zu lange.

Kann ich den Timeout ignorieren? Eventuell überlege ich mir was mit ping statt mit netstat als Kriterium ob ein Client aktiv ist? Ich würde aber gerne eine aktive Verbindung als Kriterium wählen. Wenn 192.168.178.11 "up" ist, aber keine Verbindung zu 192.168.178.70 besteht, dann soll 192.168.178.70 runterfahren.

Das wären zwei Bedingungen. Klar, geht auch, muss nur programmiert werden. Das Auto_OFF Script ist dazu geschrieben, dass über Cron alle 10 Minuten kontrolliert wird, ob alle Bedingungen für einen Shutdown zutreffen (erst wenn diese zweimal zutreffen, fährt der Server runter). Also dieses Script ist nicht gedacht, dass der Server jede Sekunde Energie spart und im selben Moment herunterfährt wie der Client. Mit dem Auto_OFF script läuft er halt 20 Minuten länger.

Dirk

glaskugel

Anmeldungsdatum:
8. Juli 2010

Beiträge: 3974

Das (kann) Minuten dauern bis die Netzwerkverbindung nicht mehr mit netstat gelistet wird, aber ok, man muss das nur wissen.

Es muss nicht unbedingt load sein, aber ping ist noch problematischer. Ob ein Client an oder aus ist, ist kein gutes Kriterium den Server runter zu fahren, zB beim Android-Handy, wo die Netzwerkverbindung (WLAN) beendet wird, sobald der Schirm schwarz wird.

Minidlna (Daemon) ist auch nicht sehr hilfreich, denn der läuft permanent. Außerdem gibt es da unterschiedliche Prozesse und ps ist auch kein Indiz, ob der Client den Server nutzt.

ps -ef | grep minidlna.pid
minidlna  1076     1  0 16:39 ?        00:00:01 /usr/bin/minidlna -f /etc/minidlna.conf -P /run/minidlna/minidlna.pid
root      1399  1315  0 16:46 pts/0    00:00:00 grep --color=auto minidlna.pid
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
UP_TIME=`cat /proc/uptime | cut -f2 -d" " | cut -f1 -d "."`
LOAD=`uptime | sed -e 's/.*: //' -e 's/,/\./g' | cut -f3 -d" "`
LOAD100=`echo $LOAD*100 | bc -l | cut -f1 -d"."`
CLIENT_UP=`netstat -n -t | grep "192.168.178.113"`

# Load <= 0.01 fährt System runter
if [ $LOAD100 -le 1 -a $UP_TIME -ge 900 ] ; then
	/sbin/shutdown -h +0
	exit
fi

if [ $LOAD100 -le 6 -a $UP_TIME -ge 900 ] ; then
	if test -z "$CLIENT_UP" ; then
		/sbin/shutdown -h +0
		exit
	fi
fi

Ich teste zur Zeit so rum: Load von 0 oder 0,01 in den letzten 15 Minuten (3. Wert) fährt das System runter, das habe ich aber noch nie erreicht. Ein Load von 0,02 kann bedeuten, dass der DLNA-Server von einem Client genutzt wird oder eben nicht. Da läuft der DLNA-Server eventuell Stunden umsonst.

Also 2. Bedingung:

Ist der Load >= 0,06 dann "arbeitet" der Server irgendwie, entweder wird der DLNA-Server von einem Client verwendet, oder es läuft irgendwas anderes das Load erzeugt, also nicht abbrechen, sondern anlassen bis der Load geringer wird.

Zwischen einem Load von 0,02 und 0,05 wird entschieden, ob der Client (113) eine Netzverbindung mit dem Server (70) hat. Existiert keine Netzwerkverbindung (mit netstat geprüft), dann wird der Server runtergefahren. Das könnte man dann noch für andere Clients und andere Dienste verfeinern.

Problem dabei ist, dass es über 1h dauerte bis der Server runtergafahren wurde. Es war kein Client an, sondern der Server erstellte für minidlna eine DB, das hat nach einiger Zeit einen Load von 100 und dauert einige Stunden. Klar ist mir nicht warum dann ein 15min. Durchschnitt von Load (mit uptime) über 1h dauert, bis der Server runtergefahren wurde. 30 Minuten kann ich mir ja noch vorstellen, dass der Load auf 0,05 runtergeht, wenn nichts mehr los ist.

Ich habe gerade getestet: up 18 min und Load 0,03, nachdem der Server nur hochgefahren wurde, aber der Client nutzt den DLNA-Server nicht, sondern eine andere Quelle und der Server wird runtergefahren, also mehr oder weniger das, was ich wollte. Es wird also indirekt geprüft, ob der DLNA-Server genutzt wird, das sagt etwas mehr aus als ping.

Es geht nun primär um die Optimierung, dass schneller runtergefahren wird. Es geht nicht um 5 Minuten, aber 1h nach Ende der Serveraktivität mehr sollten schon verbessert werden. Der 5-Minuten-Wert von load scheint noch mehr zu schwanken und ist daher noch schwieriger als Ausschaltkriterium zu definieren.

Vielleicht kann man irgendwas in /proc/netstat zur Analyse verwenden?

Antworten |