Shell: Abläufe mit xargs parallelisieren

Viele Unix-Tools, die es schon seit Urzeiten des Computers gibt, sind heutigen Softwareentwicklern und Sysadmins oft gar nicht mehr so geläufig. Daher möchte ich heute hier xargs beleuchten.

Grundlegende Benutzung

xargs ist laut Beschreibung ein Tool mit welchem man Befehlszeilen bauen und ausführen kann. Hier ein kleines Beispiel:

echo -e "1\n2\n3\n4" | xargs sleep

Der Echo-Befehl gibt die Zahlen 1 bis 4 in einer separaten Zeile aus. xargs nimmt den Inhalt aller Zeilen und hängt ihn an den Befehl sleep an. Schlussendlich wird also folgendes Ausgeführt:

sleep 1 2 3 4

Dieser Befehl wartet insgesamt 10 Sekunden und kehrt dann zurück. Will man nun aber für jeden übergebenen Parameter einen eigenen Sleep-Befehl ausführen, kann man die Anzahl der übergebenen Argumente pro Befehl beschränken:

echo -e "1\n2\n3\n4" | xargs -n 1 sleep

Jetzt werden vier sleep Prozesse gestartet, die sequentiell ablaufen. Das kann man auch gut sehen, wenn man misst, wie lange alles insgesamt dauert:

time echo -e "1\n2\n3\n4" | xargs -n 1 sleep
real 0m10.006s
user 0m0.000s
sys 0m0.004s

Parallelisierung

Und jetzt parallelisieren wir die Befehlsaufrufe. Das geht mit der Option -P. Damit können wir bestimmen, wie viele Prozesse gleichzeitig gestartet werden. Um das Beispiel einleuchtend zu machen, legen wir fest, dass 4 Prozesse gleichzeitig gestartet werden. Nach Adam Ries sollte die ganze Anweisung also nur insgesamt 4 Sekunden dauern:

time echo -e "1\n2\n3\n4" | xargs -n 1 -P 4 sleep real 0m4.003s user 0m0.000s sys 0m0.000s weiterlesen

Continuous Integration: flashplayerdebugger auf Linux-Server

Wer Continuous-Integration-Systeme für Flash- bzw. ActionScript-Projekte verwendet, wie beispielsweise Bitbucket und Bamboo aus dem Atlassian-Universum, möchte auch Unit-Tests (FlexUnit) etc. auf dem Server ausführen lassen. Das ist nicht ganz einfach, da der flashplayerdebugger ein X-Display braucht und nur als 32bit-Variante vorliegt. Ich beschreibe hier die Minimal-Variante mit der wir es unter Debian Wheezy zum Laufen gebracht haben.

Display zur Verfügung stellen

Grundsätzlich gibt es 2 Möglichkeiten FlexUnit „headless“ zu betreiben. Erstens kann man den FlexUnit ANT-Task mittels eines VNC-Servers ein entsprechendes Display bereitstellen und damit arbeiten. Zweitens kann man auch ein Framebuffer-Device per Xvfb bereitstellen, auf dem gearbeitet wird. Nach Beleuchtung beider Mechanismen wurde Xvfb als brauchbarer erachtet:

apt-get install xvfb

Das Paket bietet einerseits das Xvfb-Binary, welches dauerhaft ein Display bereitstellt und das Wrapper-Skript „xvfb-run“, mit dem man Programme in einem separaten Display starten kann (beispielsweise xvfb-run xterm ). Für CI-Umgebungen verwenden wir Xvfb als permanentes Display, da das am ressourcenschonendsten ist. Zu beachten ist, dass Xvfb am besten als der User gestartet wird, unter dem später auch die Tests laufen. Ein entsprechendes Init-Skript erledigt das:

#! /bin/bash # ### BEGIN INIT INFO # Provides: Xvfb framebuffer device # Required-Start: $local_fs # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Xvfb framebuffer device ### END INIT INFO USER="ciuser" XVFB=/usr/bin/Xvfb XVFBARGS=":0 +extension RANDR" PIDFILE=/var/run/Xvfb/xvfb.pid do_start () { echo -n "Starting virtual X frame buffer: Xvfb ..." su - ${USER} -c "/sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS" echo "." } do_stop () { echo -n "Stopping virtual X frame buffer: Xvfb ..." su - ${USER} -c "/sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE" echo "." } case "$1" in start) do_start ;; stop) do_stop ;; restart) do_stop do_start ;; *) echo "Usage: $0 {start|stop|restart}" exit 3 ;; esac weiterlesen

C#: Netzlaufkwerke mappen

Zum Mappen von Netzlaufwerken mit C# habe ich vor einiger Zeit eine schöne Klasse gefunden, die ich schon öfters genutzt habe. Leider ist die Homepage des Erstellers gerade (oder dauerhaft?) offline. Da die Lizenz das aber zulässt stelle ich euch den Code hier zu Verfügung. weiterlesen