Aparte de cerrar y volver a abrir su tty (es decir, cerrar sesión y volver a iniciarla, lo que también puede finalizar algunos de sus procesos en segundo plano en el proceso), solo le queda una opción:
- adjunte al proceso en cuestión usando gdb y ejecute:
- p dup2(abrir("/dev/null", 0), 1)
- p dup2(abrir("/dev/null", 0), 2)
- separar
- salir
por ejemplo:
$ 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
También puede considerar:
- usando
screen
; La pantalla proporciona varios TTY virtuales entre los que puede alternar sin tener que abrir nuevas sesiones SSH/telnet/etc. - usando
nohup
; esto le permite cerrar y volver a abrir su sesión sin perder ningún proceso en segundo plano en el... proceso.
Esto hará:
strace -ewrite -p $PID
No es tan limpio (muestra líneas como:write(#,<text you want to see>)
), ¡pero funciona!
También puede que no le guste el hecho de que los argumentos estén abreviados. Para controlar eso usa el -s
parámetro que establece la longitud máxima de las cadenas mostradas.
Captura todas las transmisiones, por lo que es posible que desee filtrar eso de alguna manera:
strace -ewrite -p $PID 2>&1 | grep "write(1"
muestra solo las llamadas del descriptor 1. 2>&1
es redirigir STDERR a STDOUT, como strace
escribe en STDERR por defecto.
refiriéndose a la excelente investigación de vladr (y otros):
cree los siguientes dos archivos en el mismo directorio, algo en su ruta, diga $HOME/bin:
silent.gdb, que contiene (de la respuesta de vladr):
p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit
y silencio, que contiene:
#!/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
Ahora, la próxima vez que se olvide de redirigir Firefox, por ejemplo, y su terminal comience a abarrotarse con los inevitables mensajes "(firefox-bin:5117):Gdk-WARNING **:colisión XID, problemas por delante":
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
También puede redirigir la salida de gdb a /dev/null si no desea verlo.