(在Ubuntu 10.04 64位服务器上运行)
昨天,我没有使用屏幕,而是通过SSH启动了一个进程(我没有意识到需要花费几天时间才能运行)。 今天我花了一整天的时间试图找出一些方法,我可以从SSH的铁抓取撬程序的输出,所以我可以重新启动我的客户端机器,但没有得到任何地方。
我尝试使用gdb,并按照本页底部的说明 ,但是当我运行第一个gdb命令来创build一个文件,我得到一个错误消息,说明No symbol table is loaded. Use the "file" command. No symbol table is loaded. Use the "file" command. 从我收集到的信息来看,这意味着我必须重新编译我要redirect输出的程序,这对我来说现在已经没有任何帮助了。
我也认为我可以使用retty将输出redirect到另一个terminal,但显然它不能在64位平台上编译。
我怎样才能将这个进程的输出redirect到另一个terminal或文件?
它看起来像给予gdb是不正确和不完整的几种方式。
首先,你需要使用
gdb [executablefile] [pid]
让GDB知道它连接到的程序实际上是什么 。 我只是testing这个,它可以使用一个剥离的可执行文件。 请注意,当gdb被附加到进程时,进程将被挂起。 如果此过程正在通过networking进行通信,请快速键入,否则networking连接可能会超时。
其次,给出的命令并不能解释他们在做什么,而且你应该把cd“指向你想要你的程序写文件的目录”的指令是错误的,因为gdb正在要求原始程序执行creat()函数。 给出的示例将在运行程序的当前工作目录中创buildmyprog.stderr和myprog.stdout文件,而不是在运行gdb的目录中。 如果您不知道程序的CWD是什么(或者查看ls -l /proc/[pid]/cwd ),请在这里使用绝对path名。
第三,在缺less解释的情况下运行,重要的是要知道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 buildins。 如果你不使用bash,那么你从这里独立。 bg将一个暂停的作业移动到后台,就好像它是用somecommand &在那里启动的,当bash退出的时候, disown会从bash的活动程序列表中删除程序到SIGHUP。
你不能远程做任何事情。 使用sshlogin到另一台服务器,并使用与启动该进程相同的帐户。 您将能够控制新会话的过程。
你可以使用reredirect( https://github.com/jerome-pouiller/reredirect/ )。
types
reredirect -m FILE PID
和输出(标准和错误)将被写入文件。
reredirect README还解释了如何恢复进程的原始状态,如何redirect到另一个命令或只redirectstdout或stderr。