【问题标题】:SSHJ hangs forever on join()SSHJ 在 join() 上永远挂起
【发布时间】:2012-02-23 21:39:15
【问题描述】:

我使用 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()))

【问题讨论】:

  • 一个想法是重定向标准输入和标准错误,因此在最后一个与号之前放置一个2>&1 可能会有所帮助。不过,我在使用不同的命令时遇到了类似的问题,所以它可能无法完全解决它。
  • 更正我的评论:这没有帮助——如果您没有另外指定,nohup 将为您重定向。我注意到这个库中有一些线程问题;也许你遇到过?
  • @ilfrin ,主线程阻塞,因为您正在调用 commandObject.join() 而没有超时。这会阻止当前线程等待通知。如果被调用的程序挂了,主线程也挂了。

标签: sshj


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。

    我个人的建议是,每当您使用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) {}
    

    希望它对遇到类似问题的人有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-17
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      相关资源
      最近更新 更多