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

mutt: gesamte Email in Datei speichern

Will man bestimmte Teile einer Mail in eine Datei speichern, kann man mittels v alle Parts anzeigen lassen und dann mit speichern. Dabei werden aber keine Header gespeichert.

Will man die komplette Mail inklusive Header und Anhängen als Datei speichern kann man nutzen (Pipe bzw. senkrechter Strich). Dieser bewirkt, dass die Mail über STDIN an einen Befehl geschickt wird – daher öffnet sich eine Kommandozeile. Dort gibt man dann einfach folgendes ein:

weiterlesen

getssl: Let’s Encrypt ohne Python-Client

Vorwort

Nachdem Mozilla starke Kritik an Wosign und Startcom geübt hat, entfernte nun Apple als erstes die Zertifizierungsstelle aus seinen Trust-Stores. Für den Otto-Normal-Verbraucher heißt das nun, dass die Zertifikate von StartCom und Wosign faktisch wertlos sind; es ist ungewiss, ob sich die CA davon wieder erholt, auch wenn die Maßnahme vorerst auf ein Jahr begrenzt ist, und sich WoSign dann erneut einer unabhängigen Überprüfung unterziehen lassen kann.

Damit bleibt Let’s Encrypt die letzte mir bekannte Möglichkeit, kostenlos SSL-Zertifikate zu nutzen. Und bei aller berechtigten Kritik an dem Vorgehen, Zertifikte nur für 90 Tage auszustellen und diese mit einem Client automatisiert erneuern zu lassen, ist das Verfahren zumindest transparent und quelloffen.

Wem der native Python-Client nicht zusagt, der kann aus einer Vielfalt von alternativen Clients wählen. Ich habe mich für getssl entschieden, und möchte hier kurz eine Einführung geben.

Installation

Getssl ist ein simples Bash-Skript – daher kann auch ein unerfahrener Entwickler in den Code schauen und nachvollziehen, was dort eigentlich passiert. Installiert wird das Skript folgendermaßen:

curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > /usr/local/sbin/getssl
chmod 700 /usr/local/sbin/getssl

Anschließend kann man das Skript mit -h aufrufen, um sich verfügbare Parameter ausgeben zu lassen:

$ getssl -h
getssl ver. 1.61
Obtain SSL certificates from the letsencrypt.org ACME server

Usage: getssl [-h|--help] [-d|--debug] [-c|--create] [-f|--force] [-a|--all] [-q|--quiet] [-Q|--mute] [-u|--upgrade] [-U|--nocheck] [-w working_dir] domain

Options:
  -h, --help      Display this help message and exit
  -d, --debug     Outputs debug information
  -c, --create    Create default config files
  -f, --force     Force renewal of cert (overrides expiry checks)
  -a, --all       Check all certificates
  -q, --quiet     Quiet mode (only outputs on error, success of new cert, or getssl was upgraded)
  -Q, --mute      Like -q, but mutes notification about successful upgrade
  -u, --upgrade   Upgrade getssl if a more recent version is available
  -U, --nocheck   Do not check if a more recent version is available
  -w working_dir  Working directory

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

Owncloud zu Nextcloud migrieren

Nach Unstimmigkeiten des Owncloud-Gründers mit der dahinter stehenden Firma hat er einen eigenen Fork namens Nextcloud erstellt. Im Nachgang musste die amerikanische Firma Owncloud Inc. schließen, nachdem ihnen die Kreditlinie gestrichen wurde. Die Owncloud GmbH in Deutschland ist davon zwar nicht unmittelbar betroffen, es bleibt aber wohl eine Frage der Zeit.

weiterlesen

JDownloader headless auf Debian-/Ubuntu-Server installieren (ohne Xvfb oder VNC)

Ich habe mir zu dem Zweck eine VM mit Ubuntu 16.04 installiert, natürlich eine Minimalinstallation. Als erstes sind ein paar Vorbereitungen zu treffen, wie einen dedizierten Nutzer anzulegen:

$ mkdir /opt/jdownloader
$ useradd -M -d /opt/jdownloader -s /bin/bash jdownloader
$ chown -R jdownloader:jdownloader /opt/jdownloader

Jetzt wird Java installiert (Debian-Nutzer können auch die Version 7 installieren, sofern die 8 noch nicht in den Repositories ist):

$ apt-get install openjdk-8-jre-headless

Anschließend brauchen wir den JDownloader. Ladet euch von der Download-Seite die JAR-Datei herunter (Betriebssystemauswahl: Other), und legt es in den Ordner /opt/jdownloader.

Ist das getan, kann der JDownloader das erste Mal gestartet werden. Dabei wird er sich erstmal selbst installieren und nebenbei auf Updates prüfen:

$ su - jdownloader
$ cd /opt/jdownloader
$ java -jar JDownloader.jar

Ist der Lauf durch, sollte sich der Befehl selbst beendet haben – JDownloader läuft jedoch bereits im Hintergrund weiter. Um sicher zu gehen, dass alle Updates korrekt installiert wurden, kann man den letzten Befehl noch einmal ausführen. Anschließend killt man den JDownloader:

$ ps -ef|grep JDownloader
jdownlo+  5417     1 99 13:22 pts/0    00:00:12 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -jar JDownloader.jar -afterupdate

$ kill 5417

weiterlesen

Linux Server: Festplattenbelegung analysieren

Es gibt unter Linux viele Tools, die zur Analyse des belegten Speichers auf Dateisystemen genutzt werden können. Mit „du“ lässt sich beispielsweise der Speicherverbrauch verschiedener Verzeichnisse berechnen, mit „df“ kann man sich eine Übersicht über die Belegung der eingebundenen Dateisysteme verschaffen. Für eine detaillierte Gesamtanalyse sind sie aber nur bedingt geeignet.

weiterlesen

Linux-Server: Teamspeak installieren

Hier eine kurze Anleitung um Teamspeak auf einem Linux-Server zu installieren. Diese Anleitung ist für die meisten Distributionen gültig.

Als erstes laden wir die Server-Version von der offiziellen Seite herunter und packen Sie auf den Server und entpacken es unter /opt.

tar -C /opt -xvjf /pfad/zum/archiv/teamspeak3-server_linux_<arch>.tar.bz2

Ich habe das Verzeichnis der Einfachheit halber dann einfach in „teamspeak“ umbenannt.

mv /opt/teamspeak3-server* /opt/teamspeak

Anschließend erstellen wir einen User unter dem es dann laufen soll und übereignen die Daten.

useradd -M -d /opt/teamspeak teamspeak
chown -R teamspeak:teamspeak /opt/teamspeak

Teamspeak bringt von Haus aus ein recht umfangreiches Init-Skript mit. Leider kann in diesem kein User eingestellt werden, unter welchem der Dienst laufen soll, weshalb ich selbst ein minimales Startskript geschrieben habe, das als Wrapper für das vorhandene fungiert. Auf debian-basierten Systemen mit SysV-Init-System würde man also folgendes tun:

wget -O /etc/init.d/teamspeak https://raw.githubusercontent.com/misterunknown/teamspeak/master/teamspeak
update-rc.d teamspeak defaults

weiterlesen

Screen: Anzeigen, wo man sich befindet

Wer die Terminal-Multiplexer-Software GNU screen nutzt, sieht in der Standardkonfiguration nach dem Starten erstmal – nichts. Damit sich das ändert kann man die Dokumentation lesen und sich eine Konfigurationsdatei basteln, die seinen Anspüchen genügt. Wessen Ansprüche nicht hoch genug sind, dass er sie selbst schreiben will, der kann meine haben, die ich mir in mühevoller Kleinarbeit mal gebastelt habe:

weiterlesen

Linux: extrem große Dateien bearbeiten

Wer unter Linux mit großen Dateien hantiert, kann nicht immer einen klassischen Editor zum Bearbeiten nutzen. Aktuelles Beispiel bei mir ist ein Datenbank-Dump, der 11 GB groß ist.

Anzeigen und Suchen

Zum Anzeigen von und Suchen in großen Dateien eignen sich die Tools head, tail, less und grep:

# head gibt per default die ersten 10 Zeilen einer Datei aus.
$ head datei.txt
# Die Anzahl der Zeilen ist aber konfigurierbar.
$ head -n 200 datei.txt

# tail gibt die letzten 10 Zeilen einer Datei aus, oder eine definierte
# Anzahl Zeilen.
$ tail -n 50 datei.txt

# less bietet sich an, wenn man erstmal einen Überblick erhalten möchte.
$ less datei.txt
# Zerstören Zeilenumbrüche die Übersicht? Mit -S lassen sich diese verhindern
$ less -S datei.txt

weiterlesen