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.