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

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

我知道如何重定向输出以及如何镇压他们在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

答案1

您可以使用重定向(https://github.com/jerome-pouiller/reredirect/)。

reredirect -m /dev/null <PID>

您可以稍后使用以下命令恢复进程的初始输出:

reredirect -N -O <M> -E <N> <PID>

<M>并且<N>由之前启动的重定向提供)。

reredirectREADME还解释了如何重定向到另一个命令或仅重定向 stdout 或 stderr。

答案2

那是不可能的。或者至少不容易。您可能会运气好,将 gdb 附加到进程并在 gdb 中摆弄它,但这可能会像成功一样容易导致崩溃。

答案3

你应该使用雷普特尔将另一个进程附加到新的当前终端。例如:安装并使用 GNU 的screen实用程序,并在其中启动reptyr命令来“获取”其他进程的重定向(和控制终端)并将它们附加到新的当前终端(该screen进程,如果您reptyr从启动screen)。从会话中执行此操作的优点screen是,一旦处于 状态screen,就可以轻松断开连接并重新连接到它(例如,关闭本地会话、回家并重新打开它)。

相关内容