我知道如何重定向输出以及如何镇压他们在bash中。现在,假设我不小心忘记将输出重定向部分附加到命令中(例如2>&1
或> /tmp/mystdout
)并且我的后台进程已经运行了一段时间,我仍然可以更改为正在写入的位置stdout
吗stderr
?我真的不想终止并重新启动应用程序。
按照要求更具体吉尔斯在他的评论中,我想具体在这些场景中摆弄它:
- 错误的输出文件
- 忘记重定向
stderr
到stdout
或两者的组合
例如,我正在运行 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
,就可以轻松断开连接并重新连接到它(例如,关闭本地会话、回家并重新打开它)。