26.02.2014 Aufrufe

LinuxUser Skripten und Coden (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!