如何更改正在运行的进程的输出重定向?


11

我知道如何重定向输出以及如何在bash中抑制它们。现在,假设我不小心忘了输出重定向部分的命令(例如追加2>&1> /tmp/mystdout)和我的后台进程已经运行一段时间,我还可以更改为stdoutstderr正在写入?我真的不想杀死并重新启动该应用程序。

就像吉尔斯在评论中所要求的那样,我要在以下特定情况下专门弄弄它:

  • 错误的输出文件
  • 忘记重定向stderrstdout

或两者结合

例如,我正在运行Apache,并且可以看到文件描述符:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

切换到另一个终端?还是要一个文件?如果您对附加到当前终端或新的屏幕会话感到满意,请参阅如何放弃正在运行的进程并将其关联到新的屏幕外壳?
吉尔(Gilles)“所以,别再邪恶了”

Answers:



3

那不可能 或至少不容易。将gdb附加到进程并在gdb中进行修改可能会有些运气,但这可能导致崩溃和成功一样容易。



随时分享他们,我会
投票赞成


1
不完全的。另一个错误中链接的所有工具都与附加到另一个终端/屏幕会话有关。与重定向到另一个文件无关。尽管修补reptyr以重定向到文件可能并不难。
Dennis Kaarsemaker

我已经研究了reptyr的来源,并且我最同意答案的“不容易”部分。可能会在一段时间后更深入地研究它。
gertvdijk

2

您应该使用reptyr将另一个进程附加到新的当前终端。例如:安装并使用GNU的screen实用程序,然后在其中启动reptyr命令以“获取”另一个进程的重定向(并控制终端),并将它们附加到新的当前终端(该screen进程,如果您是reptyr从发起的screen)。在screen会话中执行此操作的好处是,一旦位于之下screen,就很容易断开连接并重新连接到该会话(例如,关闭本地会话,回家然后重新打开它)。


感谢您的回答,但由于我没有询问终端分离/拉提,因此这对我的情况没有帮助。请重新阅读我的问题和具体示例。
gertvdijk 2012年

嗯,在这种情况下:请阅读reptyr代码,了解如何对其进行修改以仅重定向stdout或stderr。然后从另一个将新连接的流重定向到您想要的流的shell运行它?(或者更好的是,使用reptyr来源,直接进行重定向)
Olivier Dulac 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.