如何重定向已在运行的进程的 stdout/stderr?

如何重定向已在运行的进程的 stdout/stderr?

(在 Ubuntu 10.04 64 位服务器上运行)

昨天,我犯了一个错误,没有使用屏幕就通过 SSH 启动了一个进程(我没有意识到这个进程要花几天时间才能运行)。我今天花了一整天时间试图找出某种方法,让我可以从 SSH 的铁腕控制中撬出进程的输出,以便我可以重新启动我的客户端机器,但一无所获。

我尝试使用 gdb 并按照底部的说明进行操作这一页但是当我运行第一个 gdb 命令来创建文件时,我收到一条错误消息,说明No symbol table is loaded. Use the "file" command. 从我收集的信息来看,这意味着我必须重新编译我试图重定向其输出的程序,当然这对我现在已经运行没有任何帮助。

我还认为我可以使用 retty 将输出重定向到另一个终端,但显然它不能在 64 位平台上编译。

我如何将此过程的输出重定向到另一个终端或文件?

答案1

看起来给出的说明gdb在很多方面都是不正确和不完整的。

首先,你需要使用

gdb [executablefile] [pid]

这样 GDB 就知道它实际连接的是什么程序。我刚刚测试了它,它可以使用剥离的可执行文件。请注意,当 gdb 连接到进程时,进程将被暂停。如果此进程正在通过网络通信,请快速输入,否则网络连接可能会超时。

其次,给出的命令没有解释什么他们正在做什么,而您应该 cd “到您希望程序将文件写入的目录”的指令是错误的,因为 gdb 要求原始程序执行该creat()函数。给出的示例将在正在运行的程序的当前工作目录中创建 myprog.stderr 和 myprog.stdout 文件,而不是在您运行 gdb 的目录中。如果您不知道该程序的 CWD 是什么(或查看ls -l /proc/[pid]/cwd),请在此处使用绝对路径名。

第三,由于缺乏解释,重要的是要知道第一个参数dup2()是前一个返回的文件描述符编号creat(),因此如果此正在运行的程序打开了多个文件,则最终可能会出现类似的交换

(gdb) call creat("/home/me/myprog.stdout",0600)
$1 = 7
(gdb) call dup2(7,1)
$2 = 1
(gdb) call creat("/home/me/myprog.stderr",0600)
$3 = 8
(gdb) call dup2(8,2)
$4 = 2

当您退出 gdb 时,它会询问您是否要“仍然退出(并将其分离)”,答案是肯定的。

最后,bgdisown是 bash 的内置命令。如果您没有使用 bash,那么从这里开始您就得靠自己了。 bg将暂停的作业移至后台,就像使用 在那里启动一样somecommand &,并disown在 bash 退出时将该程序从 bash 的活动程序列表中删除并发出 SIGHUP 信号。

答案2

您无法远程执行任何操作。使用 ssh 和用于启动该过程的同一帐户登录到另一台服务器。您将能够从新会话控制该过程。

答案3

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

类型

reredirect -m FILE PID

并且输出(标准和错误)将写入文件中。

reredirect README 还解释了如何恢复进程的原始状态,如何重定向到另一个命令或仅重定向 stdout 或 stderr。

相关内容