Unix-Prozesse, völlig losgelöst...

2010-05-21

Es gibt 3 Möglichkeiten einen Unix-Prozess per Kommandozeile von einem Terminal zu entkoppeln, z.B. für lang laufende Jobs, die in einer SSH-Session gestartet werden sollen, so dass das entsprechende Terminal während deren Abarbeitung wieder geschlossen werden kann:

nohup du -skh /home/* &
#nohup: ignoring input and appending output to `nohup.out'

nohup immunisiert das auszuführende Kommando gegen hangup Signale und die Ausgabe wird in die Datei nohup.out umgelenkt (anstatt in die Standardausgabe).

screen
du -skh /home/*
# Das virtuelle Terminal wird mit <Ctrl>-A <Ctrl>-D verlassen.
#
# Und mit Resume kann später wieder zurückgekehrt werden:
screen -r

screen ist ein virtuelles Terminal, in welches man sich nach belieben ein- und ausklinken kann.

du -skh /home/* > du.log
# Prozess mit Tastenkombination <Ctrl>-Z unterbrechen
bg
jobs
#[1]+  Running                  du -skh /home/* > du.log &
disown -h %1

disown informiert die Shell darüber, dass kein hangup Signal an den Prozess mit der geg. Job-ID gesendet werden soll, wenn sie später geschlossen wird. Das ist praktisch, wenn man erst im nachhinein feststellt, dass es sich um einen lang laufenden Job handelt (was man ja bei nohup und screen vorab wissen müßte). Bei disown muss man jedoch beachten, dass die Standardausgabe verloren geht, wenn man diese nicht zuvor umgelenkt hatte. Ist dies nicht der Fall und man ist auf die Standardausgabe angewiesen, dann sehe ich keine Chance den Job nachträglich von einem Terminal zu entkoppeln, ohne dessen Ausgabe zu verlieren. Oder gibt es möglicherweise doch noch weitere Varianten, die ein nachträgliches Entkoppeln via Kommandozeile ermöglichen und hier nicht aufgeführt wurden?