Und als Gott sprach: Ab in den Hintergrund mit dir (…)!

Na, welcher Linux-Nerd/Admin kennt das nicht? – man möchte ein Kommando starten, welches auch das Abmelden überlebt – allerdings soll dieses weiterhin von eigenen Skripten oder sogar via FTP steuerbar bleiben. Ich habe nun hier die Lösung – eine komplette One-Line-Kommando-Lösung, womit ihr euer Programm starten könnt aber sowohl Input, also auch Output (+ Eltern-PID) in eine eigene Datei geschrieben bekommt / könnt (Nicht vergessen SUB und KOMMANDO anzupassen!):

mkdir -p /tmp/SUB/; mkfifo /tmp/SUB/IN; nohup bash -c "while [ -e /tmp/SUB/IN ]; do cat /tmp/SUB/IN; sleep 0.4; done | bash -c \"echo \$ > /tmp/SUB/PID; KOMMANDO; echo \"End\" > /tmp/SUB/IN; rm /tmp/SUB/IN\"" > /tmp/SUB/OUT 2>&1 </dev/null &

Aber was macht das Kommando denn jetzt genau? Nun ich erkläre im Folgenden einmal die jeweiligen Teilkommandos, getrennt durch die “;”. Das erste “mkdir” stellt sicher, dass diese Instanz alle Dateien in das passende /tmp/SUB-Unterverzeichnis ablegt. Dort liegen dann ‘IN’ als Eingabe-Pipe (NICHT zum Lesen geeignet, da das lesende Programm eingefroren wird), eine ‘OUT’-Datei, welche als einfache Textdatei die Konsolenausgabe beinhaltet und eine ‘PID’-Datei, welche die Prozessid speichert. Eben diese ‘IN’-Pipe wird mit dem nächsten Teil des Kommandos angelegt. Das Besondere an einer Pipe ist, dass diese immer nur dann ausgelesen wird, wenn auch in diese geschrieben wird – diese Eigenschaft wird später beim “cat” benötigt. Der dritte Teil beginnt nun eine neue, persistente (also überlebt das Abmelden) Bash , welche ihre Ausgabe in die ‘OUT’-Datei schreibt. Diese neue Bash-Instanz wird mit den ersten vier Unterkommandos (while … done) die Eingabe der ‘IN’-Pipe auslesen (man beachte das “sleep 0.4”, damit die Kommandos auch nur nacheinander weitergegeben werden – gleichzeitig eine Anti-Spam-Absicherung) und via der Konsolen Pipe ‘|’ an das darauf folgende Kommando weiterreichen. Dieses erneute Unterkommando erstellt nun die eigentliche Bash für das auszuführende Kommando dar, welche nun deren Prozessid in die ‘PID’-Datei ablegt und nach dem Beenden des Kommandos ein “End” in die Ausgabe schreibt.

Wenn ihr das alles verstanden habt – Oh ha! Das Entwickeln dieses Kommandos hat mich mehrere Stunden gekostet, lößt aber viele Probleme ohne dabei Zusatzsoftware zu erfordern – perfekt für meinen Problemfall.

Viel Spaß damit!