Aus LinuxUser 06/2008

Skripte schreiben

Ohne Crash durch die Bash

Mit der Bourne-Again-Shell schreiben Linux-Anwender Skripte, die nervige und stupide Aufgaben automatisieren – etwa um auf dem Notebook Strom einzusparen.

Die meisten Linux-Nutzer stolpern – meist früher, als ihnen lieb ist – über die Bash oder „Bourne Again Shell“. Um ein Problem zu lösen, schlagen die Bewohner einschlägiger Linux-Foren gern vor, doch „schnell ein kleines Skript zu schreiben“. Die Aufforderung lässt den Anwender meist entweder verärgert oder ratlos im Regen stehen. Wer sich jedoch etwas Zeit nimmt und in die Bash einarbeitet, merkt schnell, wie schön sich mit Hilfe kleiner Skripte zahlreiche Aufgaben erledigen lassen. Ein guter Ansatz besteht darin, die Probleme und Schritte in konsumierbare Häppchen zu zerlegen.

Skripte folgen üblicherweise einem einfachen Grundschema: Eingabe – Verarbeitung – Ausgabe. Zum Skripten öffnen Sie zunächst eine neue Datei in einem Texteditor. Die speichern Sie ohne Endung ab, etwa als test. Dann machen Sie die Datei über chmod u+x ausführbar und rufen das Skript über ./test auf. Sofern Sie es so programmiert haben, können Sie jedem Skript auch Argumente mit auf den Weg geben. Das gilt zum Beispiel für folgendes einfache Skript:

#!/bin/bash
echo $*

Speichern Sie es als test und führen Sie es aus, wobei Sie ihm gleich mehrere Argumente mitgeben:

$ ./test Was machst du?
Was machst du?

Die Zeile #!/bin/bash am Anfang nennt sich Shebang und teilt dem Interpreter mit, dass er es mit einem Bash-Skript zu tun hat. Der Befehl echo schreibt gewöhnlich etwas in die Standardausgabe – in diesem Fall die Konsole. Dank des Spezialparameters $* gibt echo sämtliche Argumente (*) wieder, mit denen Sie das Skript aufrufen.

Soll das Skript nur das zweite Argument auslesen – im Beispiel das Wort machst – ersetzen Sie das Sternchen durch eine 2. Die Spezialparameter können Sie zwar auslesen, Ihnen aber keine festen Werte zuweisen – im Gegensatz zu den gewöhnlichen Bash-Variablen.

Das Skript in Listing 1 fragt die auf Ihrem System vorhandenen Governors (Abbildung 1) ab. Dabei handelt es sich um Kontrollalgorithmen, die sich um die Performance eines Prozessors kümmern. Der Standard-Governor ondemand lässt sich durch den energieeffizienten Governor powersave ersetzen, der Strom spart, aber die Leistung der CPU nur wenig beeinflusst.

Listing 1
#!/bin/bash
GOVERNORS=/sys/devices/system/cpu/cpu?/cpufreq/scaling_available_governors
cat $GOVERNORS
Abbildung 1: Drei einfache Zeilen zeigen die auf dem System verfügbaren Governors an.
Abbildung 1: Drei einfache Zeilen zeigen die auf dem System verfügbaren Governors an.

Die Namen der verfügbaren Governors verrät – meist (siehe Kasten „Bugs“) – die Datei scaling_available_governors. Den absoluten Pfad zu ihr legen Sie in der Variable GOVERNORS ab. Dank des Fragezeichens in cpu? liefern Rechner mit mehreren CPUs – etwa Dual-Core-Systeme – auch mehrere Werte zurück (für cpu0, cpu1 etc.) Der Befehl cat liest über den Umweg der Variable $GOVERNORS die Datei(en) aus und zeigt das Ergebnis an.

Bugs

Wichtig zu erwähnen: Die Skripte aus den Listings 1 bis 3 laufen nur auf Rechnern, auf denen es die dort angegebenen Dateien wie scale_governor gibt. In Listing 2 fehlen aus Platzgründen zudem Sicherheitsmaßnahmen, die ein Abstürzen nach der Eingabe „falscher“ Werte (etwa Buchstaben statt Zahlen) verhindern respektive auffangen. Schreiben Sie Skripte für andere Benutzer, sollten Sie stets alle möglichen und unmöglichen Eingaben berücksichtigen, um solche Fehler zu vermeiden.

Generell definieren Sie systemabhängige und veränderbare Elemente am besten als Variablen am Anfang eines Skripts. Andere Anwender, die Ihr Werk nutzen, passen dann einfach nur die Pfade im Skript den Gegebenheiten auf ihrem Rechner an. Sie selbst sparen durch kurze, prägnante Variablennamen Tipparbeit.

Der Testrechner verfügt über fünf Governors. Den aktuell genutzten Status verrät die Datei /sys/devices/system/cpu/cpu?/cpufreq/scaling_governor. Es genügt, in diese Datei das Wort powersave einzufügen, um einen anderen der verfügbaren Governors zu nutzen. Das Kommando

$ sudo echo powersave > /sys/devices/system/cpu/cpu?/cpufreq/scaling_governor

versagt in diesem Fall aber. Gewöhnlich schreibt das Symbol > die Ausgabe von echo in die Datei scaling_governor. In diesem Fall fehlen der Umleitung respektive der Bash die nötigen Rechte dafür, Sie wandeln das Kommando also leicht ab:

$ echo powersave | sudo tee /sys/devices/system/cpu/cpu?/cpufreq/scaling_governor

Der Befehl tee bekommt in diesem Fall die Root-Rechte. Er schreibt die Standardeingabe auf den Bildschirm und zugleich in die Datei scaling_governor. Wenden Sie erneut Cat auf die Datei scaling_governor an, liefert der Befehl den Ausdruck powersave zurück – je nach Menge der CPUs ein oder mehrmals (Abbildung 2).

Abbildung 2: Bei Dual-Core-Prozessoren liest und schreibt das Skript dank des Fragezeichens, das als Platzhalter funktioniert, gleich in zwei Dateien.
Abbildung 2: Bei Dual-Core-Prozessoren liest und schreibt das Skript dank des Fragezeichens, das als Platzhalter funktioniert, gleich in zwei Dateien.

Mit Hilfe einer If-Abfrage überprüfen Sie automatisch, ob ein Prozessor im Powersave-Modus läuft und ändern den Zustand, wenn dem nicht so ist (Listing 2).

Listing 2
#!/bin/bash
GOVERNORS=/sys/devices/system/cpu/cpu?/cpufreq/scaling_governor
cat $GOVERNORS | grep "powersave"
if [ $? != 0 ]; then
  echo "Prozessoren laufen/ Prozessor läuft nicht im Powersave-Modus."
  echo powersave | sudo tee $GOVERNORS
  echo "Powersave-Modus aktiviert!"
else
  echo "Prozessoren laufen/ Prozessor läuft bereits im Powersave-Modus."
fi
LinuxUser 06/2008 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: