2012-01-07 55 views
2

是否可以抓取/拦截已运行的Java程序的输出?从正在运行的Java程序拦截输出

这是我的情况:我正在运行一个需要几个小时才能完成的程序。所以我启动它,让计算机执行它的工作。我可以使用SSH登录运行该程序的计算机,并看到它正在运行ps,但我想拦截写入控制台的输出。

有没有办法做到这一点?

我需要提供额外信息吗?

回答

6

screen会话中启动应用程序,从会话中分离,然后您可以ssh并重新连接以查看进度。 以下是关于using screen的一些信息。

另一种选择是将标准输出和标准错误重定向到文件,并使用类似tail的内容来查看其内容。例如:my_program &> /tmp/output

好的,我刚刚意识到我有点偏离主题,因为我处理的情况下,你必须提前思考。现在,如果tou想从正在运行的进程中获得它,你可以使用gdb

gdb -p process_id 
(gdb) p close(1) 
$1 = 0 
(gdb) p creat(“/tmp/output″, 0600) 
$2 = 1 
(gdb) q 

这将使输出/tmp/output,并再次,你可以使用tail看到它交互。

+1

+1提到重定向到文件并使用“尾巴”来查看。 – Perception 2012-01-07 23:36:48

+0

谢谢,这个作品!是否有可能'脱离'新的听众?我也想注意你必须这样做** root **用户。 – Henridv 2012-01-08 09:15:51

+0

是否可以稍微解释一下这些gdb命令的作用?我已经找到了这篇文章,但并没有解释每条命令:[link](http://blog.tridgell.net/?p=4) – Henridv 2012-01-08 09:31:10

0

是的,你应该捕捉它的标准输入,输出和错误流。退房$ man popenthis SO question

编辑:对于已经运行的进程,请参阅是否可以将基本调试器附加到进程并按照上述方式复制输入和输出流。