Bash:如何重定向已运行进程的输出?

5
2个回答

7

可以使用gdb来实现。这个问题已经在这个帖子中得到了解答。


使用调试器强制代码在目标进程中运行并不是一个“粗暴”的过程。 - bmargulies
1
@bmargulies: (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

4

没有,至少不是可靠的。

当一个进程被fork时,在fork()之前,它的前三个文件描述符(至少)由其父进程安排,因此它继承了它们。

在fork之后,没有内核代码,任何进程都无法对它们进行操作,除非是该进程本身。

好吧,几乎没有。支持调试器(例如gdb)的系统调用可以用于在进程中强制执行内存和函数调用。在实验室中,这可以用来关闭和重新打开这些流。在现实生活中,如果您在调试器中捕获到进程并尝试这样做,无法保证进程处于非常不幸的状态,并且会自我燃烧。


咳嗽 gdb... 咳嗽 strace。咳嗽 如何在命令行中启动进程后重定向其标准错误输出和标准输出? https://dev59.com/WnRB5IYBdhLWcg3wiHv7 :) - SyntaxT3rr0r
@Web 咳嗽内核,但我明白你的意思。 - bmargulies
2
+1 表示指出这种 gdb 的 hackery 不能保证正常工作。 - Jander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接