A meno di chiudere e riaprire il tuo tty (ovvero disconnettersi e riconnettersi, che potrebbe anche terminare alcuni dei tuoi processi in background nel processo) hai solo una scelta rimasta:
- allegare al processo in questione utilizzando gdb ed eseguire:
- p dup2(open("/dev/null", 0), 1)
- p dup2(open("/dev/null", 0), 2)
- stacca
- esci
ad esempio:
$ 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
Puoi anche considerare:
- usando
screen
; screen fornisce diversi TTY virtuali che puoi passare da uno all'altro senza dover aprire nuove sessioni SSH/telnet/etc - usando
nohup
; questo ti consente di chiudere e riaprire la sessione senza perdere alcun processo in background nel... processo.
Questo farà:
strace -ewrite -p $PID
Non è così pulito (mostra linee come:write(#,<text you want to see>)
), ma funziona!
Potrebbe anche non piacerti il fatto che gli argomenti siano abbreviati. Per controllarlo usa il -s
parametro che imposta la lunghezza massima delle stringhe visualizzate.
Cattura tutti i flussi, quindi potresti volerlo filtrare in qualche modo:
strace -ewrite -p $PID 2>&1 | grep "write(1"
mostra solo le chiamate del descrittore 1. 2>&1
è reindirizzare STDERR a STDOUT, come strace
scrive su STDERR per impostazione predefinita.
prendendo spunto dall'eccellente ricerca di vladr (e di altri):
crea i seguenti due file nella stessa directory, qualcosa nel tuo percorso, ad esempio $HOME/bin:
silenzio.gdb, contenente (dalla risposta di vladr):
p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit
e silenzio, contenente:
#!/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
Ora, la prossima volta che ti dimentichi di reindirizzare firefox, ad esempio, e il tuo terminale inizia a riempirsi degli inevitabili messaggi "(firefox-bin:5117):Gdk-WARNING **:XID collision, trouble ahead":
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
Puoi anche reindirizzare l'output di gdb a /dev/null se non vuoi vederlo.