4

我使用 SSHJ 执行一些命令,我​​使用这种方法:

  private Command executeCommand(String command, SSHClient client) {
    Command commandObject = client.startSession().exec(command);
    commandObject.join();
    return commandObject;
  }

在我执行此命令之前它运行良好:

cd $SOLR; nohup java -Dsolr.solr.home=./solr -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -jar start.jar 2> logs/solr.log &

在这种情况下,整个程序挂起

commandObject.join();

当然,它开始的过程已经开始。从 shell 执行的同一行也会立即返回。

知道为什么以及如何克服这个问题吗?

编辑:当我不加入()但读取命令的 sysout(使用 commons-io)时,也会发生同样的情况:

IOUtils.toString(commandObject.getInputStream()))
4

2 回答 2

2

大概你正在运行的java应用程序是一个守护进程?(或者至少,它在退出之前等待了很长时间)

最好在目标机器上设置一个专用脚本来控制守护程序的初始化/关闭,而不是依靠 SSH 客户端发送正确的命令序列。这样,该脚本封装了干净地启动和停止您的守护程序和其他需要控制它的应用程序所需的所有内容,只需调用此脚本即可启动和停止,而无需了解有关记录位置的详细信息,启动它所需的 java 命令,如何使进程后台运行等。

您可以滚动您自己的 init 样式脚本,也可以为此使用Tanuki 的 Java Service Wrapper(或类似的)。

于 2012-08-21T10:37:34.077 回答
1

我有同样的问题。

我个人的建议是,每当您使用时,join您实际上应该设置一些超时以使其过期并且不要永远锁定线程。在我使用多个命令的情况下,我初始化了一个Shell实例,例如会执行以下操作:

try
{
            shell = session.startShell();
}
catch (Exception e)
{
            // failed to open
            return;
}
outputStream = shell.getOutputStream();
outputStream.write(Strings.toUTF8ByteArray("some fast command\n"));
outputStream.flush();
try {   shell.join(1, TimeUnit.SECONDS); }
catch (Exception e) {}
outputStream.write(Strings.toUTF8ByteArray("some complex command\n"));
outputStream.flush();
try {   shell.join(30, TimeUnit.SECONDS); }
catch (Exception e) {}

希望它对任何有类似问题的人有用。

于 2016-03-15T22:31:03.163 回答