我使用 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 执行的同一行也会立即返回。
知道为什么以及如何克服这个吗?
编辑:
当我不 join() 但读取命令的 sysout 时也会发生同样的情况(使用 commons-io):
IOUtils.toString(commandObject.getInputStream()))
最佳答案
据推测,您正在运行的 Java 应用程序是一个守护进程? (或者至少,它在退出之前等待了很长时间)
最好在目标机器上有一个专用脚本来控制守护程序的初始化/关闭,而不是依赖 SSH 客户端来发送正确的命令序列。这样,脚本封装了干净启动和停止守护程序和其他需要控制它的应用程序所需的所有内容,只需调用此脚本即可启动和停止,而无需知道有关记录位置的详细信息,启动它所需的 java 命令,如何后台处理等。
您可以使用自己的 init 样式脚本或为此使用 Tanuki's Java Service Wrapper (或类似的)。
关于SSHJ 在 join() 上永远挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9421761/