Ausgabe eines laufenden Prozesses umleiten
Ich hatte ja neulich schon
einmal das “/proc”-Filesystem erwähnt, und natürlich kann man in Linux damit
noch andere Sachen machen - z.B. STDOUT
oder STDERR
eines laufenden Prozesses
umleiten (ein bißchen Hilfe braucht man allerdings dabei schon).
Schauen wir uns mal ein Beispiel an: Der folgende Prozess schreibt STDERR
in
das Terminal, indem wir ihn gestartet haben, und STDOUT
nach /tmp/foo
:
|
|
Hilfreicherweise zeigt mir die Shell auch gleich die Prozess-ID an, so daß es
ein leichtes ist, herauszufinden, wohin STDOUT
(FD 1) und STDERR
(FD 2) zeigen:
|
|
Es ist jetzt an der Zeit, den GNU Debugger zu bemühen. Wir “attachen” uns an
die Prozess-ID 4767
und geben dem Debugger als “Hint” auch gleich noch mit,
welches das Binary ist, das den Prozess erzeugt hat (wir kanonisieren diesen
Namen hier noch, da nc
unter Debian über eine Kette von Symlinks auf
verschiedene Binaries zeigen kann):
|
|
Unser Ziel ist es nun, STDOUT
zuerst zu schließen - worfür wir close(2)
benutzen - und danach mit neuem Ziel zu öffnen - wofür wir creat(2)
nutzen
werden. Das geht eigentlich relativ einfach:
|
|
Mit der “p”-Funktion lassen wir uns den Rückgabewert von close
auf den FD
1 - also STDOUT
- anzeigen. Hier wird eine 0 zurück geliefert, es hat also
alles funktioniert. Danach verwenden wir den gleichen Mechanismus, um die Datei
/tmp/bar
zu erzeugen, mit den Rechten 0644
. Und tatsächlich:
|
|
Wenn wir schonmal im Debugger sind hätten wir übrigens noch Dutzend andere
Sachen machen können - aus aktuellem Anlass sei hier mal gezeigt wie man
herausfindet, welche umask
ein laufender Prozess hat:
|
|
Der erste Aufruf von umask
gibt uns als Ergebnis den Wert an, der bis zu
diesem Aufruf aktuell war. In diesem Fall war das eine 18
. Nach Oktal
umgewandelt ergibt das 0022
. Mit dem zweiten umask
-Aufruf setzen wir
übrigens wieder den alten Wert - das sollte man nicht vergessen.
In diesem Sinne!