如何阻止Linux Bash后台进程向控制台输出内容
搞定后台进程乱输出的小技巧
哎呀,我太懂这种烦恼了——刚把进程丢后台,结果它不停往PuTTY里喷输出,根本没法干别的!别着急,已经启动的进程也能补救,给你几个实用方法:
方法1:快速重定向(适合刚后台化的进程)
如果你刚用Ctrl+Z+bg把进程丢后台,还没退出当前shell,这么操作最快:
- 先把进程拉回前台:输入
fg,然后按Ctrl+Z再次暂停它 - 接着用这条命令,把输出全导去日志文件,同时让进程脱离当前shell的控制:
这里的nohup %1 &> /tmp/run.sh.log &%1是你的后台job编号,不确定的话输jobs就能看到(比如[1]+ Stopped ./run.sh,那就是%1) - 最后补个
disown %1,确保你退出shell时进程不会被终止
方法2:直接修改进程的文件描述符(通用救急法)
如果进程已经跑了很久,不想暂停它,那就直接改它的输出指向:
- 先拿到进程的PID:用
ps aux | grep run.sh或者jobs -l(如果是当前shell的job) - 假设PID是
1234,执行下面两条命令,把标准输出和错误输出全导去日志:
要是这个方法没生效,试试用gdb强制修改(需要先装gdb):# 把stdout(文件描述符1)重定向到日志 ln -sf /tmp/run.sh.log /proc/1234/fd/1 # 把stderr(文件描述符2)也同步过去 ln -sf /tmp/run.sh.log /proc/1234/fd/2
这个方法更硬核,哪怕进程自己会重新打开输出也能搞定。gdb -p 1234 -batch -ex 'call close(1)' -ex 'call close(2)' -ex 'call open("/tmp/run.sh.log", 0x41, 0644)' -ex 'call dup2(1,2)'
方法3:临时屏蔽输出(应急小妙招)
要是只是暂时不想看输出,不想折腾进程,试试stty tostop——这条命令会让后台进程一尝试输出就自动暂停。之后你输jobs会看到进程状态变成Stopped (tty output),等你想看输出了,要么用fg把它拉回前台,要么输stty -tostop取消这个限制就行。
这些方法我自己都用过好几次,亲测有效~
内容的提问来源于stack exchange,提问作者RonPringadi
相关产品推荐
相关产品推荐

