Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Schwerpunkt<br />
GNU Parallel<br />
Bei größeren Bildersammlungen verrät<br />
der GNU-Parallel-Parameter ‐‐progress,<br />
wie weit die Verarbeitung bereits fortgeschritten<br />
ist. Mit ‐‐eta berechnet GNU<br />
Parallel auch noch die voraussichtliche<br />
Bearbeitungsdauer. Um die Verarbeitung<br />
abzubrechen, beenden Sie GNU Parallel<br />
einfach mit [Strg]+[C] oder senden ihm<br />
das TERM-Signal (etwa mit killall<br />
‐TERM parallel). Im letzten Fall wartet<br />
GNU Parallel noch, bis die gerade laufenden<br />
Jobs ihre Arbeit beendet haben.<br />
Übereignung<br />
Die bisherigen Beispiele führten die Parameter<br />
für die Jobs hinter drei Doppelpunkten<br />
auf. Alternativ übergeben Sie<br />
die Parameter über eine Pipe (Listing 1,<br />
Zeile 1) oder sammeln alle Parameter –<br />
in diesem Fall die Dateinamen – in einer<br />
Textdatei (Listing 1, Zeile 2).<br />
In beiden Fällen geht GNU Parallel davon<br />
aus, dass jeder Parameter mit einem<br />
Zeilenumbruch endet. Einen Dateinamen<br />
mit Leerzeichen zerhackt das Programm<br />
folglich nicht in mehrere einzelne<br />
Parameter, sondern übergibt ihn an<br />
Mogrify korrekt als Ganzes. Sollte sich jedoch<br />
ein Zeilenumbruch in einen Dateinamen<br />
eingeschmuggelt haben, bauen<br />
Sie den Parameter ‐0 ein (Zeile 3). In diesem<br />
Fall verwendet GNU Parallel das<br />
Nullzeichen (\0) als Trenner.<br />
Einbauküche<br />
In den bisherigen Befehlen ersetzt<br />
Mogri fy das Originalbild mit der geschrumpften<br />
Variante. Besser wäre es,<br />
würde die bearbeitete Fassung stattdessen<br />
in dem dafür eingerichteten Verzeichnis<br />
kleiner/ landen:<br />
$ mogrify ‐resize 50% bild.tif klU<br />
einer/bild.tif<br />
Damit taucht der Dateiname allerdings<br />
an gleich zwei Stellen auf. GNU Parallel<br />
darf also nicht mehr nur einfach den Dateinamen<br />
an den Mogrify-Befehl anhängen,<br />
sondern muss ihn an ganz bestimmten<br />
Positionen einbauen. Genau<br />
für diesen Zweck existiert der Platzhalter<br />
{} (Listing 2, Zeile 1).<br />
Dabei setzt GNU Parallel den Parameter<br />
(in diesem Fall den Dateinamen) an<br />
die Stelle der Klammern {}. Diesen Platzhalter<br />
gibt es noch in weiteren praktischen<br />
Varianten. So schneidet etwa {.}<br />
die Dateierweiterung ab. Das können Sie<br />
wiederum nutzen, um flugs mit Convert<br />
die verkleinerten Bilder auch noch ins<br />
PNG-Format zu überführen (Zeile 2).<br />
Analog liefert der Platzhalter {//} den<br />
Verzeichnisnamen.<br />
Nennen Sie GNU Parallel keinen Befehl,<br />
nimmt das Werkzeug an, dass die<br />
Eingabe die auszuführenden Befehle<br />
enthält. Auf diese Weise füttern Sie GNU<br />
Parallel mit mehreren verschiedenen<br />
Befehlen:<br />
$ (echo ls; echo pwd) | parallel<br />
Hier erzeugt zunächst die Shell mithilfe<br />
von echo die zwei Zeilen ls <strong>und</strong> pwd,<br />
welche sie dann an GNU Parallel übergibt,<br />
das die beiden Befehle dann wiederum<br />
gleichzeitig ausführt 5 .<br />
Zeit frisst nicht nur das Umwandeln von<br />
Bildersammlungen, sondern auch das<br />
Verarbeiten großer Dateien. Auch hier<br />
hilft wieder GNU Parallel. So verfüttert<br />
der folgende Befehl beispielsweise die<br />
große Datei ubuntu.img an das Tool:<br />
$ cat ubuntu.img | parallel ‐‐pipeU<br />
‐‐recend '' ‐k gzip >ubuntu.img.gz<br />
Aufgr<strong>und</strong> des Parameters ‐‐pipe zerschneidet<br />
GNU Parallel die hereinfließenden<br />
Daten in 1 MByte große Blöcke.<br />
Jeden dieser Blöcke komprimiert es<br />
dann – wieder möglichst gleichzeitig –<br />
mittels Gzip. Die gepackten Datenblöcke<br />
sammelt das Tool wieder ein, bringt sie<br />
in die richtige Reihenfolge (‐k) <strong>und</strong> legt<br />
sie dann in der Datei ubuntu.img.gz ab.<br />
Dieses Archiv lässt sich mit gzip ‐d ganz<br />
normal wieder entpacken.<br />
Der Parameter ‐‐recend steht für „Record<br />
End“. Über ihn kann man angeben,<br />
wo jeweils ein Datenblock endet. Ohne<br />
andere Angabe nimmt GNU Parallel an,<br />
dass es an jedem entdeckten Zeilenumbruch<br />
ein weiteres Stück von der großen<br />
Datei abschneiden muss. Im obigen Beispiel<br />
soll es aber Blöcke von jeweils<br />
1 MByte Größe an Gzip übergeben. Daher<br />
setzen die zwei einfachen Anführungsstriche<br />
'' die Voreinstellung von<br />
‐‐recend außer Gefecht.<br />
Nach dem gleichen Prinzip lassen sich<br />
auch andere große Dateien parallel verarbeiten.<br />
Die Dokumentation zu Parallel<br />
sortiert damit beispielsweise eine große<br />
Textdatei û. Das Einpacken mit Gzip hat<br />
übrigens einen kleinen Schönheitsfehler:<br />
Da GNU Parallel immer nur Häpp-<br />
Listing 1<br />
01 $ find . ‐name '*.tif' | parallel mogrify ‐resize 50%<br />
02 $ parallel ‐a dateinamen.txt mogrify ‐resize 50%<br />
03 $ find . ‐name '*.tif' | parallel ‐0 mogrify ‐resize 50%<br />
Listing 2<br />
01 $ parallel mogrify ‐write kleiner/{} ‐resize 50% {} :::<br />
*.tif<br />
02 $ parallel convert {} {.}.png ::: *.tif<br />
5 GNU Parallel interpretiert hier die Eingaben als Befehle.<br />
16 www.linux-user.de<br />
06.2013