Bash:让已放入后台的进程静默输出
没问题,这种情况我也碰到过,不用重启进程就能搞定!下面给你几个可行的方法,从无额外工具的通用方案到更简便的工具辅助方案都有:
方法1:利用/proc文件系统(无需额外工具)
这是最通用的方案,靠Linux自带的/proc文件系统就能实现:
- 第一步,先找到后台进程的PID。你可以用
pgrep application(把application换成你实际的进程名)快速获取,或者用ps aux | grep application筛选出对应的数字PID。 - 第二步,进入该进程的文件描述符目录:
这里面的cd /proc/<你的进程PID>/fd1对应stdout(标准输出),2对应stderr(标准错误),就是当前在污染你shell的两个输出通道。 - 第三步,把这两个通道重定向到
/dev/null:
执行完这两步,进程的输出就会直接被丢进/dev/null,不会再干扰你的shell了。如果遇到权限问题,在命令前加ln -sf /dev/null 1 ln -sf /dev/null 2sudo即可(前提是你有sudo权限)。
方法2:用reptyr工具(更直观)
如果你觉得/proc的方式有点抽象,可以用reptyr工具把后台进程拉回前台,再重新设置重定向:
- 先安装reptyr:不同系统的包管理器不一样,比如Ubuntu/Debian用
sudo apt install reptyr,CentOS/RHEL用sudo yum install reptyr。 - 找到进程PID后,执行:
这时候你的后台进程会回到前台,暂时会继续输出内容到shell。reptyr <你的进程PID> - 按下
Ctrl+z暂停进程,然后执行:
这样进程会回到后台,同时把stdout和stderr都定向到/dev/null。最后可以加个bg %1 1>/dev/null 2>&1disown %1,让进程和当前shell彻底解绑,就算你退出shell它也能继续运行。
方法3:用gdb(适合进阶用户)
如果上面的方法都不适用,还可以用gdb直接修改进程的文件描述符:
- 执行命令把gdb附加到目标进程:
gdb -p <你的进程PID> - 在gdb的交互命令行里依次输入:
原理是先关闭原来的stdout(描述符1)和stderr(描述符2),然后重新打开/dev/null,系统会把新的文件描述符分配为刚关闭的1和2,这样就完成了重定向。最后 detach 脱离进程,quit退出gdb即可。call close(1) call open("/dev/null", 0666) call close(2) call open("/dev/null", 0666) detach quit
内容的提问来源于stack exchange,提问作者schorsch312
相关产品推荐
相关产品推荐

