GNU/Linux >> LINUX-Kenntnisse >  >> Linux

STDERR / STDOUT eines Prozesses umleiten, NACHDEM er gestartet wurde, über die Befehlszeile?

Außer dem Schließen und erneuten Öffnen Ihres tty (d.h. sich ab- und wieder anzumelden, was auch einige Ihrer Hintergrundprozesse in diesem Prozess beenden kann) bleibt Ihnen nur eine Wahl:

  • mit gdb an den fraglichen Prozess anhängen und ausführen:
    • p dup2(open("/dev/null", 0), 1)
    • p dup2(open("/dev/null", 0), 2)
    • lösen
    • beenden

zB:

$ tail -f /var/log/lastlog &
[1] 5636

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog

$ gdb -p 5636
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Attaching to process 5636
Reading symbols from /usr/bin/tail...(no debugging symbols found)...done.
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f3c8f5a66e0 (LWP 5636)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2

(no debugging symbols found)
0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6

(gdb) p dup2(open("/dev/null",0),1)
[Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)]
$1 = 1

(gdb) p dup2(open("/dev/null",0),2)
$2 = 2

(gdb) detach
Detaching from program: /usr/bin/tail, process 5636

(gdb) quit

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog
lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/null

Sie können auch Folgendes in Erwägung ziehen:

  • mit screen; screen bietet mehrere virtuelle TTYs, zwischen denen Sie wechseln können, ohne neue SSH/telnet/etc-Sitzungen öffnen zu müssen
  • mit nohup; Dadurch können Sie Ihre Sitzung schließen und erneut öffnen, ohne dass Hintergrundprozesse im ... Prozess verloren gehen.

Das geht:

strace -ewrite -p $PID

Es ist nicht so sauber (zeigt Zeilen wie:write(#,<text you want to see>) ), funktioniert aber!

Möglicherweise gefällt Ihnen auch die Tatsache nicht, dass Argumente abgekürzt werden. Verwenden Sie zur Steuerung die -s Parameter, der die maximale Länge der angezeigten Zeichenfolgen festlegt.

Es erfasst alle Streams, also möchten Sie das vielleicht irgendwie filtern:

strace -ewrite -p $PID 2>&1 | grep "write(1" 

zeigt nur Deskriptor-1-Aufrufe. 2>&1 ist das Umleiten von STDERR zu STDOUT, als strace schreibt standardmäßig in STDERR.


vladr's (und andere) exzellente Recherchen abklatschen:

Erstellen Sie die folgenden zwei Dateien im selben Verzeichnis, irgendwo in Ihrem Pfad, sagen wir $HOME/bin:

silence.gdb, enthält (aus vladrs Antwort):


p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit

und Stille, enthaltend:


#!/bin/sh
if [ "$0" -a "$1" ]; then
 gdb -p $1 -x $0.gdb
else
 echo Must specify PID of process to silence >&2
fi

chmod +x ~/bin/silence  # make the script executable

Wenn Sie jetzt beispielsweise das nächste Mal vergessen, Firefox umzuleiten, wird Ihr Terminal mit den unvermeidlichen „(firefox-bin:5117):Gdk-WARNING **:XID Collision, Trouble Ahead“-Meldungen überladen:


ps  # look for process xulrunner-stub (in this case we saw the PID in the error above)
silence 5117  # run the script, using PID we found

Sie können die Ausgabe von gdb auch nach /dev/null umleiten, wenn Sie sie nicht sehen möchten.


Linux
  1. Herunterfahren oder Neustarten von Linux über die Befehlszeile

  2. Einen Prozess nach einer bestimmten Zeit von der Befehlszeile aus stoppen/beenden?

  3. Datei nach Verwendung des Sed-Befehls speichern?

  4. So starten Sie Linux über die Befehlszeile neu

  5. Leiten Sie die gesamte Ausgabe in eine Datei in Bash um

So erstellen Sie eine Datei in Linux mit Terminal/Befehlszeile

So leiten Sie stderr in Bash auf stdout um

Lernen Sie Ihr System kennen (über die Befehlszeile)

So testen Sie die Internetgeschwindigkeit über die Befehlszeile in Linux

Wie leite ich stderr und stdout in verschiedene Dateien in derselben Zeile im Skript um?

Erfassen von STDERR und STDOUT in einer Datei mit tee