staging.inyokaproject.org

Alternatives AutoSuspend-Skript

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels Archiv/Skripte/AutoSuspend.

Quetschke

Anmeldungsdatum:
5. Juli 2008

Beiträge: 61

Hallo zusammen,

ein rund um die Uhr laufender Heimserver verursacht einen ziemlich hohen Energieverbrauch. Daher habe ich nach einer Lösung gesucht, Energie zu sparen. Die Nutzung von granola (ähnlich powernowd) war ein guter Anfang, doch reichte mir das nicht.

Dann bin ich auf das "Auto OFF"-Skript gestoßen, was mir vom Ansatz her sehr gut gefallen hat. Allerdings möchte ich meinen Server nicht komplett herunterfahren, da das Booten ja auch seine Zeit braucht und er - wenn er gebraucht wird - schnell zur Verfügung stehen soll. Daher habe ich mich entschlossen, das Skript zu ändern, sodass stattdessen ein Suspend eingeleitet wird.

Das "Auto SUSPEND"-Skript konnte ich nicht nutzen, da der Server in erster Linie Dienste bereitstellt und selten ein Nutzer per SSH angemeldet ist.

Als ich nun schon dabei war, habe ich das Skript noch um ein paar für mich wichtige Funktionen erweitert und bin zu dem Schluss gekommen, dass diese auch für andere nützlich sein könnten.

Daher habe ich unter Baustelle/Skripte/AutoSuspend einen Wiki-Eintrag mit der modifizierten Version des Skriptes und einigen weitergehenden Informationen angelegt. Bitte gebt mir ein Feedback, ob der Artikel in das Wiki verschoben werden soll oder überflüssig ist.

Danke!

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

ein paar Anmerkungen:

  • Die Warnbox bei "Vorbereitung" ist überflüssig- Führe einfache alle zu installierenden Pakete gem. Wiki-Syntax auf und verweise wo notwendig auf die entsprechenden Artikel.

  • Befehle wie sudo touch /etc/autosuspend_resumeplan gehören in eine Befehlsbox, nicht eine Codebox.

Ansonsten IMHO ok.

Gruß, noisefloor

Feuerblitz2

Anmeldungsdatum:
21. Juli 2010

Beiträge: 15

Hi habe einen kleinen Fehler gefunden Hier ist der Dateiname falsch

Und anschließend ausführbar gemacht: 
sudo chown root:root /usr/local/sbin/checkshutdown.sh
sudo chmod u+x /usr/local/sbin/checkshutdown.sh 

richtig heißt es

Und anschließend ausführbar gemacht: 
sudo chown root:root /usr/local/sbin/autosuspend.sh
sudo chmod u+x /usr/local/sbin/autosuspend.sh 

MFG Feuerblitz2

Ps.: Ich nehme die Änderung gleich vor.

Feuerblitz2

Anmeldungsdatum:
21. Juli 2010

Beiträge: 15

Hallo

Ich finde das man den ersten Satz anders Formulieren sollte.

Dieses AutoSuspend-Script versetzt den Computer bei Nichtbenutzung automatisch in den Standby-Modus (je nach Verfügbarkeit: ...

Besser finde ich:

Dieses AutoSuspend-Script versetzt den Computer bei Nichtbenutzung automatisch in den Energiespar-Modus (je nach Verfügbarkeit: ...

Weiter hin sollte man auf eine einheitliche Verwendung der Begriffe "Standby Hibernate" achten.

MFG Feuerblitz2

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Hi!

Ich hab' das ganze jetzt verschoben, Skripte/AutoSuspend, allerdings ist mir dabei auch dieses Skript aufgefallen: Skripte/Auto SUSPEND, das anscheinend nicht nur in der Namensgebung ganz ähnliches beinhaltet...

Brauchen wir dann wirklich beides? Sollte man es besser zusammenfassen?

Trotzdem erstmal besten Dank an Quetschke 👍

so long
hank

EDIT: Ok, man sollte genauer lesen, Einwand ist ja im Eröffnungspost schon ausgeräumt... -sorry!

H.i.M

Avatar von H.i.M

Anmeldungsdatum:
17. November 2006

Beiträge: 261

Ich habe einige Anregungen zu diesem Artikel. Es geht um Schritt 4. Dieser funktioniert bei mir (Kubuntu 10.04.3) so nicht. Siehe dazu http://forum.ubuntuusers.de/topic/magic-packet-nach-suspend-to-ram-via-wlan-senden/.

1. wird in pm-utils beschrieben, dass Hooks unter

1
/usr/lib/pm-utils/sleep.d

abgespeichert werden sollen.

2. wird der Hook in Schritt 4 nicht ausführbar gemacht.

3. ist dessen Priorität (90) für systemkritische Anwendung vorbehalten und wird noch vor dem Networkmanager (55) ausgeführt. Das hat zur Folge, dass das magic-packet ins Nirwada geht.

EDIT

4. scheint

1
exit $?

zu fehlen(?).

Ich schlage daher vor den Befehl zum erstellend der Konfigurationsdatei zu ändern in (es fehlt noch exit $?):

1
echo -ne '#!/bin/sh\ncase "$1" in\n\tresume|thaw)\n\t\t/usr/local/sbin/wakeserver.sh\n\t\t;;\nesac\n' | sudo tee /usr/lib/pm-utils/sleep.d/50_wakeserver 

und

1
sudo chmod +x /usr/lib/pm-utils/sleep.d/50_wakeserver

Weitere Anregungen & Kritik sind sehr willkommen.

Grüße H.i.M

Lemy

Anmeldungsdatum:
27. Juni 2008

Beiträge: 20

Hi

ich hab noch ne Kleinigkeit in das Skript eingebaut, um es auf meinem Meidaserver laufen zu lassen.

Ich bin mir nicht ganz sicher ob ich das hier richtig verstanden habe:

1
2
3
4
# Read logged users
USERCOUNT=`who | wc -l`;
# No Suspend if there are any users logged in
test $USERCOUNT -gt 0 && { logit "some users still connected, auto suspend terminated"; return 1; }

aber da ich diesen Server auch zum Fime gucken usw. benutze, ist permanent ein Nutzer angemeldet. Deshalb hab ich den oben genannten Teil auskommentiert und durch

1
2
3
4
5
# Monitor an?
	if [ `xset q -display :0.0| grep "Monitor is " | tail -c3` = "On" ]; then 
		logit "Monitor ist an, auto suspend terminated"
		return 1
	fi

ersetzt. Somit bleibt der Server an, wenn ich lokal irgendwas mache.

Vielleicht hilft das ja manch einem.

Grüße

Lemy

architom

Anmeldungsdatum:
12. März 2012

Beiträge: Zähle...

Hallo,

Ich habe das Skript auf meinen Server eingebaut und es funktioniert soweit. Er legt sich schlafen und wacht auch wieder auf.

Was ich allerdings bisher nicht geschafft habe ist, dass sich der Server z.B. nicht erst nach Mitternacht schlafen legt, sondern schon z.B. 22:00 Uhr. Im Skript ist ja als "night" die Zeit von 3 - 8 Uhr hinterlegt. Ich kenne mich mit shell-scripts nun nicht so aus, dass ich das alles durchblicken würde. Irgendwie komme ich nicht so richtig mit den Zeiten klar bzw. schaffe es nicht, den "date"-Befehl anzupassen. Problem ist für mich dabei, den richtigen Tag zu treffen.

Lässt sich das ganze nicht so anpassen, dass man in einer Datei z.B. angeben kann:

night_start = 22:00
night_end = 6:30
# und was jetzt in autosuspend_resumeplan steht:
wakeup = 7:00

?

Grüße architom

Lemy

Anmeldungsdatum:
27. Juni 2008

Beiträge: 20

So nachdem ich nun endlich das Wake on Lan zufriedenstellend gelöst habe, kommt dieses Skript bei mir nun auch wirklich zum Einsatz. Ich dokumentier hier mal die von mir gemachten Veränderungen. Wenn jemand sich für dieses Skript zuständig fühlt kann er/sie sinnvolle Änderungen ja in den Wikieintrag übernehmen.

# Important applications that shall prevent the suspend.

Hier brauchte ich eine Möglichkeit auch Javaprogramme zu identifizieren, speziell den JDownloader. Dafür habe ich pgrep in IsRunning() die Option -f mitgegeben

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
IsRunning()
{
	for i in $*; do
		if [ `pgrep -fc $i` -gt 0 ] ; then # Option -f hinzugefügt, um Javaprogramme besser identifizieren zu können
			logit "$i still active, auto suspend terminated"
			return 1
		fi
	done
	return 0
}

Die Programme müssen dann folgendermaßen eingetragen werden: $ für das Zeilenende werden zu \> für das Wortende. Bei Javaprogrammen das ^ für den Zeilenanfang durch \< für den Wortanfang ersetzten.

1
APPLICATIONS='\<JDownloader.jar\> ^nxagent\> ^rsnapshot\> ^wsus\> ^wget\> ^screen\> ^mlnetp\> ^apt-get\> ^aptitude\> ^dpkg\> ^cp\>  ^unison\>'

Die Funktion IsOnline() funktionierte bei mir nicht richtig. Da ich mein gesamtes LAN absuchen wollte habe ich in der /etc/autosupend zwei Teilnetzwerke hinzugefügt (siehe unten) die ich dann in das Array Clients geschieben habe (Klammern beachten!):

1
2
3
TEILNETZWERK1="`for i in {51..99}; do echo "192.168.188.$i"; done`" # OpenVPN
TEILNETZWERK2="`for i in {106..149}; do echo "192.168.188.$i"; done`" # lokal
CLIENTS=(`echo ${TEILNETZWERK2}` `echo ${TEILNETZWERK1}` ) 

Im Skript habe ich dann den Funktionsaufruf von IsOnline() folgendermaßen abgewandelt:

1
IsOnline ${CLIENTS[@]} # Alle eintraege des Arrays werden übergeben

und die Funktion selbst abgeändert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
IsOnline()
{
	for i in $@; do #$* in $@ geaendert
		ping $i -c1
		if [ "$?" == "0" ]; then
		  logit "PC $i is still active, auto suspend terminated"
		  return 1
		fi
	done
	return 0
}

Gut möglich das das mit dem Arrayzeug unötig ist, aber irgendwas stimmte bei mir vorher nicht.

Dann habe ich noch eine Abfrage eingebaut die ermittelt ob der Bildschirm an ist (siehe mein erster Post in diesem Thema). Allerdings stellte sich raus das die Ausgabe von "xset q" den gewünschten Test "Monitor is on" nur bei aktivem DPMS ausgibt. Die zwei von mir getesteten Videoprogamme deaktivieren dies jedoch, vermutlich um ein Abschalten des Monitors während des Viedogenusses zu unterbinden. Deshalb die kleine Erweiterung zu oben. (Achtung false positiv Gefahr.)

1
2
3
4
5
6
7
# Monitor on?
	if [ "`xset q -display :0.0 | grep "Monitor is " | tail -c3`" = "On" ] || [ "`xset q -display :0.0 | grep "DPMS is " | tail -c9`" = "Disabled" ]
	   then 
		logit "Monitor is on, auto suspend terminated"
		return 1

	fi

Zu guter Letzt habe ich noch die Passage in IsBusy() auskommentiert die die eingelogten User zählt, da das bei mir nicht das gewünschte Resultat erbringt und es überflüssig geworden ist.

MfG

Lemy

PreciseFan

Anmeldungsdatum:
9. November 2012

Beiträge: 5

Hallo, nachdem PCHSwS und ich verzweifelt versucht haben das AutoSuspend-Skript zum Laufen zu bringen, haben wir festgestellt das die Syntax in der Beispiel-Konfigurationsdatei nicht funktioniert oder falsch ist. Sicher funktioniert es, wenn die Variablendefinitionen, also das hinter dem =, in solchen Anführungszeichen geschrieben werden:

" "

Also so:

VARIABLE="wert"

Gruß PreciseFan

jferch

Anmeldungsdatum:
17. Januar 2014

Beiträge: Zähle...

Hallo zusammen, ich versuche das Skript auf meinem Arch Linux fileserver zum Laufen zu kriegen, jedoch funktioniert das automatische suspend nur beim Ersten mal nach dem Reboot. Hat wer spontan eine Idee an was das liegen kann? Muss der Cronjob nach jedem aufwachen aus dem suspend neu gestartet werden? Danke im Voraus!

john.cord

Anmeldungsdatum:
26. Januar 2014

Beiträge: Zähle...

Verwende das Skript unter 12.04 LTS und bin draufgekommen das bei der SAMBA Abfrage der verwendete Schalter "-b" keine Ausgabe ergibt (zumindest unter 12.04 und der SAMBA Version 3.6.3)

Mit "-S" bekommt man ein Ergebnis, bei mir aber nich die IP sondern nur den Hostnamen. Keine Ahnung woran das liegt...

Daher sollte im Skript die Zeile

1
if [ `/usr/bin/smbstatus -b | grep $SAMBANETWORK | wc -l ` != "0" ]; then

durch

1
if [ `/usr/bin/smbstatus -S | grep $SAMBANETWORK | wc -l ` != "0" ]; then

ersetzt werden.

Interessant wäre es noch wie man SAMBA dazu bekommt das man die IP und nicht den Hostnamen angezeigt bekommt, dann wäre das Skript weiter mit der IP Range nutzbar, sonst müsste man die Hostnamen angeben.

nebosa

Anmeldungsdatum:
19. April 2014

Beiträge: Zähle...

Hi, ich bin neu hier und hab noch nicht viel Ahnung von Linux ☹ Ich hab versuch dieses Script hier zu übernehmen Skripte/AutoSuspend leider ohne grossen Erfolg... Ubuntu 13.10

Ich denke ich habe alles so gemacht wie im Wiki steht aber der PC geht nicht in Standby ☹ Wenn ich auf der Konsole "sudo /usr/local/sbin/autosuspend.sh" eingebe, kommt es zur folgenden Meldung:

AutoSuspend: some users still connected, auto suspend terminated AutoSuspend: aborted

Wäre wirklich toll wenn mir da jemand weiterhelfen könnte....

Danke!

tomXubuntu

Anmeldungsdatum:
14. September 2010

Beiträge: Zähle...

Hallo, Das ein tolles Skript, ich habe allerdings ein kleines verständnissproblem: Das Script findet einen Prozess nicht, und ich vestehe nicht warum: ich suche nach ^md0_resync$ ich hab das auch in der Datei /etc/autosuspend entsprechend ergänzt! Ein zusätzlicher logit in IsRunning() bestätigt das:

IsRunning() {

for i in $*; do logit "appl testen: $i" logit pgrep $i if [ pgrep -c $i -gt 0 ] ; then logit "Applications $i still active, auto suspend terminated" return 1 fi done return 0 }

Der Prozess läuft; ich prüfe das an der Console (als root) mit: pgrep -c "md0_resync" Der output gibt 1 aus. Der output vom Script besagt aber 0. Uund das ist genau das was ich nicht verstehe... Habe ich da irgendwo einen Denkfehler? Was mache ich falsch? Wieso klappt der pgrep an der Console, aber nicht wenn ich das Script (auch als root) ausführe??? kann mir jemand helfen?

Viele Gruesse tomXubuntu

tomXubuntu

Anmeldungsdatum:
14. September 2010

Beiträge: Zähle...

Ha! in der Datei /etc/autosuspend die hier Beitrag steht, sind die Prozesse, nach dennen gesucht werden soll in "" gesetzt. Das ist der Grund warum diese bei mir nicht gefunden werden.... Der sucht nach dem String "^md0_resync$" und den gibt es ja nicht, aber der String ^md0_resync$ wird gefunden... Jetzt bin ich natürlich kein linux Experte... Deshalb die Frage: Ich setzt hier Debain ein... ist da ein Unterschied diesbezüglich zwischen Debian und Ubuntu? Ich kann es mir zwar nicht vorstellen, aber wer weiß das schon so genau... Ansonten könnte man das hier in dem Beitrag korrigieren, bevor der nächste drauf reinfällt... Grüße tomXubuntu.

Antworten |