可能是重复的问题:
如何在命令行上启动进程并在之后重定向其输出(包括错误输出)?
在Bash中,有没有一种方法可以捕获或重定向一个进程已经运行的输出(以及标准错误输出)?
没有,至少不是可靠的。
当一个进程被fork时,在fork()之前,它的前三个文件描述符(至少)由其父进程安排,因此它继承了它们。
在fork之后,没有内核代码,任何进程都无法对它们进行操作,除非是该进程本身。
好吧,几乎没有。支持调试器(例如gdb)的系统调用可以用于在进程中强制执行内存和函数调用。在实验室中,这可以用来关闭和重新打开这些流。在现实生活中,如果您在调试器中捕获到进程并尝试这样做,无法保证进程处于非常不幸的状态,并且会自我燃烧。
(printf 'p dup2(open("/dev/null",1),1)\np dup2(1,2)\ndetach\n';sleep 1)|gdb -p $my_pid
足以通过作为一个 shell 脚本。当然,gdb
不是 POSIX,但是,很多 bash-isms 也不是 :) - Jander