当正在运行的进程在其漫长的运行过程中提供大量标准输出时,您不想杀死它并重新运行它。怎么不显示输出呢?谢谢。
答案1
一种方法是将调试器附加到进程并使其在 /dev/null 上打开标准输出:
gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid"
答案2
让我把@jimmij 指出的解决方案拉到这里,并进行一些小的修改。
(gdb) attach <pid>
...
(gdb) call open("/dev/null",O_WRONLY)
$1 = 3
(gdb) call dup2($1,fileno(stdout))
$2 = 1
(gdb) call close($1)
...
(gdb) detach
...
对于那些不熟悉 gdb 的人来说,“attach”“call”“detach”是 gdb 命令。使用 gdb 提示符中的“help Attach”获取信息。和“open”“dup2”“close”是库函数。通过“man 2 open”获取信息。
这里 O_WRONLY 等于 1 且 fileno(stdout) 等于 1 。使用文字值,否则 gdb 可能会抱怨缺少符号。
如果我们想找到一个已经打开的文件描述符,我们可以。
$ cd /proc/<pid>/fd
$ for i in * ; do
if [[ `readlink $i` == "/dev/null" ]]
fd=$i ; break
fi
done
答案3
以下将阻止正常返回以及错误消息
2&>1 >/dev/null