Ruhezustand für *Ubuntu

Wer kennt nicht das Problem? Man muss schnell mal für 1–2 Stunden weg, hat aber gefühlte 100 Fenster offen, die unterschiedlichsten Programme laufen, und man möchte nicht bei der Rückkehr alles wieder einzeln hochfahren, aufrufen etc. Ebenso wenig möchte man den Rechner aber laufen lassen, sei es um Strom zu sparen, sei es damit niemand unbefugt daran geht…
Dazu ist der Ruhezustand (engl.: Hibernation, eigentlich „Winterschlaf“) da. Er schreibt den Zustand des Systems auf die Festplatte des Rechners (weswegen der Ruhezustand gelegentlich auch „Suspend To Disk“ heißt), von wo aus er beim nächsten Hochfahren wieder gestartet werden kann. Der Effekt ist, dass man genau da weiter arbeitet (oder was auch immer tut, wenn man nicht arbeitet 😉 ), wo man aufgehört hat.

Unter Ubuntu-Derivaten ist der Ruhezustand seit 11.10 standardmäßig deaktiviert. Im Ubuntuusers-Wiki findet sich (siehe voriger Link) eine ausführliche Anleitung für diverse Ubuntu-Versionen. Eine alternative Möglichkeit bietet ein einzeiliges Skript, das ich mir mal geschrieben habe.

In diesem Artikel stelle ich nicht nur das Skript vor, sondern leite auch durch den Prozess, ein solches Skript in einem System einzusetzen. Das tue ich hauptsächlich für Anfänger; wer das also schon längst kann, kann den zweiten Teil des Artikel getrost ignorieren.

Das Skript selbst sieht so aus:


#!/bin/bash
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

# using kernel konfig to hibernate
echo disk | sudo tee /sys/power/state

Was tut das Skript?

zunächst wird mit dem echo-Befehl die Zeichenkette „disk“ ausgegeben. Die Pipe, der senkrechte Strich, gibt die Ausgabe des Befehls (also hier: das Wort „disk„) an den folgenden Befehl weiter. Dieser muss mit sudo ausgeführt werden, weil auf eine Datei zugegriffen wird, zu der nur root Schreibzugriff hat: Die Datei /sys/power/state. Der Befehl „tee“ dient dazu, etwas in eine Datei zu schreiben, in diesem Fall das durch die Pipe übergebene „disk„. Jetzt könnten einige findige Leser aufmerken und sagen: „Warum kann ich das nicht direkt mit ‚echo‚ machen? ‚sudo echo disk > /sys/power/state‚ ist doch viel komfortabler!“
Leider funktioniert es so einfach nicht, denn durch die Code-Weiterleitung (im Skript durch die Pipe, hier durch ‚>‚) wird der Befehl gewissermaßen an eine neue Instanz übergeben; diese hat aber keine Root-Rechte erhalten. Daher erhält man einen Fehler:

bash: /sys/power/state: Keine Berechtigung.

Der Befehl ‚tee kann allerdings problemlos mit sudo erweitert und dadurch mit den benötigten root-Rechten ausgeführt werden. ‚tee‚ kann auch noch mehr: Wer sich dazu informieren möchte, sollte die manpage konsultieren (man tee).

Jetzt kommt aber der spannende Teil: Dieses Stückchen Code ist bisher nichts wert, weil es nur eine Textdatei ist. Wie macht man aus dieser Textdatei ein Werkzeug, um seinen Rechner zu bedienen?

Zunächst muss der Code gespeichert werden: Man kopiert ihn in eine Textdatei, wozu man seinen bevorzugten Editor verwendet, zum Beispiel gedit. Dann speichert man die Datei unter einem Dateinamen, den man sich merkt, und legt sie an einem Ort ab, von dem man danach auf die Datei zugreifen möchte. Viele verwenden für Skripte den Ort ~/bin (also einen Ordner „bin“ im Home-Verzeichnis), nachempfunden den Systemordnern /bin, /usr/bin usw. Ich persönlich habe meinen Ordner ‚.bin‘ genannt, sodass er im Home-Verzeichnis nicht zu sehen ist, das ist aber nicht nötig. Um diesen Ordner anzulegen, sollte er noch nicht existieren, kann man selbstverständlich ebenfalls das Terminal benutzen, was im weiteren Verlauf vorausgesetzt wird (ich gehe davon aus, dass meine gebildeten Leser in der Lage sind, auf graphischem Weg einen neuen Ordner anzulegen und zu benennen):

mkdir -p ~/bin

Sollte man das Skript seiner Wahl nicht erst selbst in eine Textdatei kopiert, sondern sie von anderer Stelle erhalten haben (von einer Website, von Freunden o. Ä.), dann kann man die Datei nun an den Zielort verschieben. Dazu navigiere man in das Verzeichnis, in dem man die Datei hat (im Beispiel wird das ~/Downloads) und verschiebe die Datei:


cd ~/Downloads
mv ./hibernate.sh ~/bin

Damit aus der Textdatei nun ein Skript wird, muss man eine von zwei möglichen Wegen einschlagen. Zunächst muss man jetzt gar nichts mehr tun: Die Datei kann im Terminal ausgeführt werden, wenn man angibt, mit welchem Interpreter sie ausgeführt werden soll:

/bin/bash ~/bin/hibernate.sh

Dieser Aufruf wird das Skript starten. Allerdings ist es bei Skripten üblich, sie als ausführbar zu kennzeichnen und sich so den Aufruf des Interpreters sparen zu können.
Werfen wir einen Blick in die allererste Zeile des Skriptes. Diese ist auskommentiert, hat aber eine spezielle Form:

#!/bin/bash

Mit dieser sogenannten „Shebang“ (#!) wird dem Kernel signalisiert, dass er in dieser Zeile den Interpreter findet. Der Interpreter selbst führt die Zeile allerdings nicht aus, da das Doppelkreuz die Zeile als Kommentar markiert.

Das allein reicht allerdings noch nicht, um die Datei auszuführen. Beim Versuch, sie im Terminal auszuführen, erhalten wir wieder den Fehler „Keine Berechtigung“. Sie muss zuerst als ausführbar markiert sein. Dies erreichen wir mit dem Befehl chmod:

chmod +x ~/bin/hibernate.sh

chmod manipuliert die Zugriffsrechte einer Datei. Auch hierzu empfielt es sich, einmal die manpage und den Eintrag im Ubuntuusers-Wiki zu lesen. In diesem Fall fügen wir ein Recht hinzu (+), nämlich das des Ausführens (x, von eXecute).

Nun kann das Skript jederzeit durch seinen Namen ausgeführt werden:

~/bin/hibernate.sh
[sudo] password for alex:

disk

So ähnlich dürfte die Ausgabe aussehen. Das „disk“ hier kommt daher, dass wir ja im Code „echo ‚disk‘“ stehen haben. Also wird ‚disk‚ auch ausgegeben.

Wem das immer noch zu umständlich ist, bleiben noch zwei Möglichkeiten, den Prozess zu beschleunigen.
Zunächst kann ein alias definiert werden, ein „Schnellbefehl“, bei dem man weniger tippen muss. Ich habe mich für den Befehl ‚gotosleep‚ verwendet, weil ich durch die Auto-Vervollständigung der Bash dann nur „got“ tippen muss, bevor der Befehl automatisch vervollständigt wird. Es ist aber jeder beliebige Name denkbar, solange er nicht zufällig Name einer eingebauten Bashfunktion ist: Es wäre sehr dumm, sein Skript mit dem Namen ‚chmod‚ zu versehen, denn wie wir gesehen haben, existiert dieser Befehl schon und hat eine wichtige Funktion.

Ein Alias legt man auf folgende Weise an:

alias name='befehl'

In unserem Beispiel wäre das also:

alias gotosleep='~/bin/hibernate.sh'

Diese Zeile so in sein Terminal einzutippen wäre allerdings keine langfristig kluge Lösung, denn beim Schließen verfällt das alias. Man kann die Zeile daher in die dafür vorgesehene Datei ~/.bash_aliases eintragen (anlegen, falls diese noch nicht existiert). Eventuell muss man noch sicherstellen, dass sich folgender Code in der Datei .bashrc befindet, oder ihn gegebenenfalls einfügen:


if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

Auf diese Weise wird jedes Mal, wenn ein Terminal geöffnet wird, die Datei .bash_aliases eingelesen und damit werden sämtliche aliases, die man dauerhaft verwenden möchte, aktiviert.

Die zweite Möglichkeit, schnell auf seine Skripte zuzugreifen, ist die Verwendung der PATH-Variablen. Dies ist dann von Vorteil, wenn sich in ~/bin einige Skripte angesammelt haben und man nicht für jedes Skript ein eigenes alias schreiben möchte.

Die PATH-Variable ist eine Variable, in der alle Dateipfade abgespeichert sind, die automatisch durchsucht werden. Das heißt, befindet sich der Dateipfad ~/bin/ in der Variablen PATH, muss dieser Teil der Eingabe nicht mehr geleistet werden, sondern man kann direkt den Namen des Skriptes aufrufen:

hibernate.sh

Um einen Pfad in die PATH-Variable hinzuzufügen, muss man zwei Schritte durchführen:

  1. PATH um ~/bin erweitern
  2. die Terminal-Sitzung neustarten oder die Datei, in der PATH festgeschrieben wird, neu einlesen

auf bash-isch heißt das so:


PATH=$PATH:~/bin
export PATH

Dadurch wird in die Variable PATH der Inhalt der alten Variable PATH geschrieben; hinten wird, getrennt durch den Doppelpunkt, der neue Ort mit angegeben. Durch „export PATH“ wird die neue ‚Umgebung‘ der PATH-Variablen aktiviert.
Da wir auch das lieber dauerhaft haben wollen als nur bis zum Ende der Terminal-Sitzung, wird diese Zeile in die Datei .bashrc eingetragen:


PATH=$PATH:~/bin
export PATH

Um diese Änderung sofort gültig zu machen, kann man nun entweder seine Terminal-Sitzung schließen und eine neue starten oder man bindet die Datei .bashrc einfach für die Sitzung neu ein:

source .bashrc

Fertig! Die Ausführung war auf Wunsch einer Freundin, die sich gerade als „Terminalpadawan“ versucht, sehr viel ausführlicher als man das sonst von Blogs so gewohnt ist. Sie hat allerdings den Vorteil, dass einem Anfänger so viel Gesuche zunächst erspart bleibt, da man sich nicht die einzelnen Erklärungen, wie was geht, von verschiedenen Quellen zusammensuchen muss, sondern alles an einer Stelle hat.

Falls jemand Verbesserungsvorschläge, Wünsche, Anregungen etc. an diese Anleitung, das Skript oder zu irgendetwas Anderem haben sollte, nehme ich diese gern in den Kommentaren entgegen und ändere den Blogeintrag ggf. ab. 🙂

Herzliche Grüße,
Alex

Advertisements

Über Luyin

Computational Linguist and Classicist.
Dieser Beitrag wurde unter Howto, OSBN, Terminal, Tipps&Tricks abgelegt und mit , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

4 Antworten zu Ruhezustand für *Ubuntu

  1. Florian Diesch schreibt:

    „sudo pm-hibernate“ funktioniert auch auf aktuellen Ubuntu-Versionen und hat den Vorteil, dass die Skripte unter /etc/pm/sleep.d/ und /usr/lib/pm-utils/sleep.d/ benutzt werden. Die enthalten z.B. Sonderbehandlungen für problematische Hard- und Software und verbessern damit die Chancen, dass der Ruhenzustand und das Aufwachen daraus richtig funktionieren.

    • luy1n schreibt:

      Hallo Florian,

      danke für den Hinweis. Wird bei pm-hibernate automatisch der Bildschirm gesperrt? Das ist momentan noch ein Manko an meiner Methode, das ich zu erwähnen vergaß.

  2. bartleby schreibt:

    Abgesehen von dem berechtigten Kommentar vor mir, finde ich das eine SEHR gelungene Anleitung für Neueinsteiger. Da sollten sich mM nach einige andere ein Stück abschneiden. So nimmt man Menschen die Angst vor Unbekanntem – in diesem Fall vor einem freien System & dessen Anpassung.

    min. 2 Daumen hoch.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s