bash Skript und Multicore Prozessoren

Wenn man viel mit bash-Skripten macht, kommt man oft an das Problem, dass man Multicore-Prozessoren nicht richtig ausreizen kann. Nehmen wir das Beispiel, dass man alle *.tif Bilder in einem Ordner mit Hilfe von imagemagick zu TIFF/JPEG komprimieren moechte. Das Skript:

for i in *.tif ; do convert $i -compress JPEG $i; done

macht dieses, ein Bild nacheinander. Man koennte das ganze nun schneller machen, indem man einfach jeden convert in eine Subshell packt:

for i in *.tif ; do convert $i -compress JPEG $i &; done

kommt dann aber sehr schnell in Schwierigkeiten, wenn dann nen Ordner mit z.B. 500 Bildern hat und dann auch 500 Subshells. Eine elegantere Loesung ist, eine maximale Anzahl von Prozessen anzugeben die nicht ueberschritten wird und dann abzuarbeiten. Dafuer laesst sich xargs gut benutzen. Wenn man z.B. maximal vier Prozesse haben moechte geht das mit:

find *.tif -print0 | xargs -0 -I {} -P 4 convert -compress JPEG {} {}

Dabei bedeuten die Parameter bei find:

  • -print0 -> print the full file name on the standard output, followed by a null character

und bei xargs:

  • -0 -> Input  items  are  terminated  by a null character instead of by whitespace
  • -I {} -> Replace string
  • -P 4 -> Run  up  to max-procs processes at a time

Der String replace wird genutzt um zweimal das gleiche Argument zu uebergeben. Arbeitet man mit -n 2 werden zwei aufeinanderfolgende Argumente uebergeben.

ext2/3: fuer root reservierte Bloecke freigeben

Bei ueblichen Distributionen wie Debian oder Ubuntu wird bei dem formatieren einer Festplatte mit ext2 oder ext3 immer ein Bereich von ~5% fuer root reserviert. Dieses fuehrt dazu, dass die Festplatten einen kleineren Bereich zur Verfuegung haben, als sie eigentlich Besitzen. Gerade bei grossen Festplatten oder entsprechenden RAIDs koennen die 5% ganz schoen viel werden.

Wieviel Speicher reserviert ist kann man mit dem Tool tune2fs herausfinden. Der Befehl:

tune2fs -l /dev/mydevice

gibt mir u.a. die Werte „Reserved block count“ und „Block size“ aus. Multipliziert man nun diese beiden Zahlen bekommt man heraus, wieviele Bytes benutzt sind.

Den Speicher freigeben kann man ebenfalls mit dem Programm tune2fs:

tune2fs -m 0 /dev/mydevice

Den Unterschied kann man z.B mit dem Tool df angucken, wenn man es vorher und nachher aufruft. Interessant ist nicht der „Size“ sondern der „Avail“ Wert.