【发布时间】: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