如何将正在运行的程序的输出重定向到 /dev/null

phu*_*ehe 20 io-redirection

我知道为了抑制程序的输出,我可以将其重定向到/dev/null,例如隐藏来自 Chromium 的所有错误和警告消息,我可以像这样启动程序

chromium-browser 2> /dev/null &
Run Code Online (Sandbox Code Playgroud)

但是,如果我碰巧忘记了错误消息并键入

chromium-browser &
Run Code Online (Sandbox Code Playgroud)

(当它们出现在命令中间时这很烦人)我不知道该怎么做,除了停止应用程序并重新正确启动它。

我可以在不重新启动应用程序的情况下以某种方式重定向错误输出吗?

小智 22

这是回答here:here by vladr。答案是(引用):

  • 使用 gdb 附加到有问题的进程,然后运行:
  • p dup2(open("/dev/null", 0), 1)(用于标准输出重定向)
  • p dup2(open("/dev/null", 0), 2)(用于标准错误重定向)
  • 分离
  • 退出

我在以下脚本上尝试过:

[第一次评论后的版本:]

sleep 10 # 所以我可以有时间附加到进程
if [ "$sonorfather" == "father" ] # 避免无限递归 
然后 
   儿子父亲=儿子 ./test & 
菲 

虽然是真的 
做 
   回声“标准输出$sonorfather” 
   echo "stderr $sonorfather" >&2 
   睡觉 1 
完毕 

我在创建子进程之前禁用了 stderr 输出,这是输出:

标准输出父亲 
标准输出儿子 
标准输出父亲 
标准输出儿子 
[等等...]。 

我希望这能回答您的问题:子进程 stderr 也被重定向。

  • 这很好,但是我可能会遇到 Chrome 的问题,因为它会为每个浏览器选项卡生成一个新进程,无论如何要解决? (3认同)

小智 8

您还可以使用 nohup 启动浏览器,然后使用以下命令关闭终端窗口:

nohup chromium-browser &
Run Code Online (Sandbox Code Playgroud)

这样,浏览器将启动并与控制台分离,然后可以安静地关闭。

  • @phu 在 zsh 上,至少你可以把 `setopt nohup` 放在你的 `.zshrc` 中,它会 nohup 你运行的一切;我不确定其他贝壳 (5认同)
  • 或者你可以创建一个别名...别名铬 = nohup 铬 (3认同)
  • 这是可以接受的,除了我必须记住输入`nohup` (2认同)

小智 6

您还可以设置别名chromium-browser来代替运行chromium-browser 2> /dev/null

例如,如果您使用 bash,请编辑 /home/username/.bashrc 并添加行:

chromium-browser='chromium-browser 2> /dev/null'
Run Code Online (Sandbox Code Playgroud)

或者更好

chrome='chromium-browser 2> /dev/null'
Run Code Online (Sandbox Code Playgroud)

并保存一些击键。