如何不显示正在运行的进程的标准输出?

如何不显示正在运行的进程的标准输出?

当正在运行的进程在其漫长的运行过程中提供大量标准输出时,您不想杀死它并重新运行它。怎么不显示输出呢?谢谢。

答案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

相关内容