【问题标题】:How to monitor remote java process如何监控远程java进程
【发布时间】:2016-03-22 11:36:37
【问题描述】:

我正在使用ssh 在远程机器上启动一个java 程序来登录机器,然后运行该命令。 ssh 会话是使用JCraft java 库创建的。该进程正在启动一个 REST 服务器,并使用“&”进入后台。程序启动如下:

java -cp $ATFIMAGE/atf.jar com.atf.agent.jobs.SlaveRunner dub-001948-VM01 8888 8889  > /home/john/testHome/SlaveRunner_stdout.log 2> /home/john/testHome/SlaveRunner_stderr.log  &

我目前使用的方法是从远程服务器 scp stderr 文件并检查它是否为空。如果文件为空,那么我可以说它启动正确。这可行,但不是那么健壮:

  session.command(javaCmd);
  manager.copyArtefactFromTarget(remoteHost, remoteStdErrFile, localFileSystem);

如果启动java进程有任何延迟,stderr可以为空,然后在我从服务器收集后填充。

使用 unix 退出代码不是一种选择,因为该进程被置于后台。只有在进程退出时才能获得代码,但在这种情况下,进程甚至都没有启动。

只是想知道是否有任何方法可以监视该过程,以及它是否正确启动。

【问题讨论】:

  • 如果您关心的是“它是否正确启动”,那么您什么时候不尝试向服务器发出请求?
  • 我打算稍后在程序中向服务器发出请求,并在那里实现了重试机制。但这永远不会成功,因为 REST 服务器甚至都没有启动。它可能由于许多不同的原因而失败。错误的 java 版本,java 不在 classpath 上等。我想获得关于它是否启动的反馈的原因是我可以通知用户问题(例如 java 不在 classpath 上),然后退出应用程序。需要手动干预,因此由用户自行修复,然后重新运行程序。

标签: java linux


【解决方案1】:

您可以通过

获取后台任务的进程ID

echo $!

(见How to get PID of background process?

然后您可以使用该 pid 来轮询该进程是否仍然存在(参见例如 https://stackoverflow.com/a/14880926/1015327)。如果进程死了,你可以做出相应的反应;一旦 REST 服务正常运行,您就可以停止轮询。如果进程在特定时间段内无法激活 REST 服务,您也可以终止该进程。

但是,在我看来,您的协议可能有点复杂且容易出错。您是否考虑过运行(Java-)服务器的其他方法?

【讨论】:

  • 这可能行得通,但我认为你是对的——我认为它也容易出错。我对启动服务器没有任何其他想法。
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多