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

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

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

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

WordPress: Aktuelle Version via Skript installieren

Ich muss immer mal wieder ein WordPress-System installieren, deshalb dachte ich mir, ich lege das Zip-Archiv, welches ich sonst jedes mal downloaden müsste, irgendwo ab. Problem dabei: WordPress wird ständig geupdated, weswegen dieses Archiv auch immer aktuell gehalten werden müsste.

weiterlesen

Server: Backup in die Cloud (Google Drive)

Ich habe mich ein reichliches Jahr um eine vernünftige Backup-Lösung für meinen Server gedrückt – eigentlich viel zu lange. Das leidige Problem ist: Woher nimmt man den Speicher, die Daten zu sichern? Nach einigem herumprobieren schien mir dann Google Drive am sinnvollsten, da es meines Wissens den größten kostenlosen Online-Speicher bietet und mir die 15GB momentan ausreichen. Mega bietet zwar erheblich mehr Speicherplatz, aber keinen Linux-Client, weswegen das für mich zu viel Aufwand bedeutet hätte.

Für meinen Ubuntu-Server musste also ein Google Drive-Client her. Das ist sehr einfach, denn es gibt ein Tool namens google-drive-ocamlfuse. Dieses Tool kann den Cloudspeicher direkt ins Dateisystem mounten. Also geht es los:

$ sudo aptitude install google-drive-ocamlfuse -y

Jetzt hat man zweierlei Möglichkeiten: Entweder man hat auf seinem Server eine grafische Oberfläche installiert, über die man per VNC oder ähnlichem zugreifen kann, oder man installiert das Programm auf einem Heimrechner. Denn beim ersten Ausführen von google-drive-ocamlfuse muss man sich in einem Webbrowser authentifizieren. Leute, die die 2-Schritte-Authetifizierung nutzen (mit Code per SMS oder Smartphone-App), haben dabei keinerlei Probleme.

Hat man sich für die Variante „Heim-PC“ entschieden, muss man anschließend den Ordner ~/.gdfuse auf den Server ins Homeverzeichnis des entsprechenden Users kopieren. Soweit so gut. Die Anmeldung ist vollzogen. Fehlt nur noch das Mounten.

Ich persönlich habe mir einfach im Home-Verzeichnis einen Ordner GoogleDrive angelegt, auf den gemountet wird:

$ cd ~
$ mkdir GoogleDrive
$ google-drive-ocamlfuse ./GoogleDrive

Damit ist der Online-Speicher einfach zu benutzen, wie ein normaler Pfad im Dateisystem. Mein Backup-Skript baut erst ein tgz-Archiv zusammen und sichert es dann:

#!/bin/bash

cd /home/marco/Backup/auto # Das ist mein Backup-Verzeichnis für 
                           # die temporären Backups.

curdate=$(date +%Y-%m-%d)  # aktuelles Datum zum zurechtfinden
echo ===== >> logfile
echo $curdate Start Backup... >> logfile
mkdir $curdate             # Ordner für die Sicherung erstellen ...
cd $curdate                # ... und betreten

# An dieser Stelle könnt ihr alles wichtige in den Ordner packen.
# Wie wäre es beispielsweise mit einem MySQL-Dump?
mysqldump -uBenutzer -pPasswort --all-databases | gzip -9 > mysqldump$curdate.sql.gz 1>/dev/null 2>>../logfile

# Verzeichnis verlassen und packen
cd ..
tar cvzf serverbackup-$curdate.tgz $curdate 1>/dev/null 2>>logfile
# Mounten von GoogleDrive
google-drive-ocamlfuse /home/marco/GoogleDrive
# Verschieben des Pakets in die Cloud
mv serverbackup-$curdate.tgz /home/marco/GoogleDrive/Backups/
# Löschen des Ordners
rm -rf $curdate 1>/dev/null 2>>logfile
# Warten (es gibt immer eine gewisse Latenzzeit, bis das Dateisystem nicht
# mehr "busy" ist)
sleep 30
umount /home/marco/GoogleDrive 2>>logfile

# und fertig 🙂
echo Fertig >> logfile

weiterlesen

Bash: in Dateien suchen

Wenn man einen bestimmten Begriff innerhalb von mehreren Dateien sucht, gibt verschiedene Wege, hier 2 davon:

$ find ./ -type f -exec grep -qi "foo" ; -print

$ grep -l foo *

Letzteres ist schneller, sucht aber nicht in Unterverzeichnissen, ersteres ist etwas langsamer, dafür kann man aber in Unterverzeichnissen suchen. Wahlweise lässt sich bei find auch noch die maximale Rekursionstiefe einstellen (-maxdepth 2).

weiterlesen

MobaXTerm: Linuxlike unter Windows

MobaXTerm ist ein Tool, welches ich seit einigen Tagen benutze und nicht mehr vermissen will. Es ist eine erweiterte Konsole für Windows, die neben den essentiellen Unix-Commands wie find, sed oder awk auch einen X11 Server und verschiedene Netzwerktools (SSH) enthält.
Krönung der ganzen Sache ist, dass es nur eine einzelne, portable Exe-Datei ist, die sich zwar eine Einstellungsdatei in eigenen Verzeichnis anlegt, diese aber auch gelöscht werden kann.
Wer gezwungen ist mit Windows zu arbeiten, sich aber in vielen Situationen eine Bash wünscht, der wird mit MobaXTerm seine Freude haben.

weiterlesen