À moins de fermer et de rouvrir votre tty (c'est-à-dire de vous déconnecter et de vous reconnecter, ce qui peut également mettre fin à certains de vos processus d'arrière-plan dans le processus), il ne vous reste qu'un seul choix :
- attachez-vous au processus en question à l'aide de gdb, et exécutez :
- p dup2(open("/dev/null", 0), 1)
- p dup2(open("/dev/null", 0), 2)
- détacher
- quitter
par exemple :
$ 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
Vous pouvez également envisager :
- en utilisant
screen
; screen fournit plusieurs TTY virtuels entre lesquels vous pouvez basculer sans avoir à ouvrir de nouvelles sessions SSH/telnet/etc, - en utilisant
nohup
; cela vous permet de fermer et de rouvrir votre session sans perdre aucun processus d'arrière-plan dans le... processus.
Cela fera :
strace -ewrite -p $PID
Ce n'est pas si propre (affiche des lignes comme :write(#,<text you want to see>)
), mais fonctionne !
Vous pourriez également ne pas aimer le fait que les arguments soient abrégés. Pour contrôler cela, utilisez le -s
paramètre qui définit la longueur maximale des chaînes affichées.
Il capture tous les flux, vous pouvez donc les filtrer d'une manière ou d'une autre :
strace -ewrite -p $PID 2>&1 | grep "write(1"
affiche uniquement les appels du descripteur 1. 2>&1
est de rediriger STDERR vers STDOUT, comme strace
écrit dans STDERR par défaut.
riffant l'excellente recherche de vladr (et d'autres):
créez les deux fichiers suivants dans le même répertoire, quelque chose dans votre chemin, dites $HOME/bin :
silence.gdb, contenant (d'après la réponse de vladr):
p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit
et silence, contenant :
#!/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
Maintenant, la prochaine fois que vous oubliez de rediriger Firefox, par exemple, et que votre terminal commence à être encombré par les inévitables messages "(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
Vous pouvez également rediriger la sortie de gdb vers /dev/null si vous ne voulez pas la voir.