ubuntu – 如何重定向已经运行的进程的stdout / stderr?

前端之家收集整理的这篇文章主要介绍了ubuntu – 如何重定向已经运行的进程的stdout / stderr?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
(在Ubuntu 10.04 64位服务器上运行)

昨天,我犯了一个错误,就是在不使用屏幕的情况下通过SSH启动一个进程(我没有意识到要花几天时间才能运行).我今天花了一整天的时间试图找出一些方法,我可以从SSH的铁把手中撬开这个过程的输出,这样我就可以重新启动我的客户端机器,但是我没有到达任何地方.

我尝试使用gdb并遵循this page底部的说明,但是当我运行第一个gdb命令来创建文件时,我收到一条错误消息,指出没有加载符号表.使用“file”命令.从我收集的内容来看,这意味着我必须重新编译我正在尝试重定向输出程序,这当然对我来说完全没有帮助,因为它已经在运行了.

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

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

看起来为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时,它会问你是否要“退出(并分离)”,答案是肯定的.

最后,bg和disown是bash builtins.如果你没有使用bash,那么你就可以从这里独立. bg将暂停的作业移动到后台,好像它是使用somecommand&来启动的,并且当bash退出时,disown将程序从bash的活动程序列表中移除到SIGHUP.

猜你在找的Ubuntu相关文章