я выполнить некоторые команды с помощью SSHJ, я делаю это с помощью этого метода:SSHJ висит вечно на Join()
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();
Конечно, начинается процесс. Также сразу же возвращается одна и та же строка из оболочки.
Любая идея, почему и как ее преодолеть?
EDIT: то же самое происходит, когда я не присоединиться(), но читать SYSOUT команды (с Викисклада гипергликемии):
IOUtils.toString(commandObject.getInputStream()))
Одной из идей было бы перенаправить stdin и stderr, поэтому размещение '2> & 1' до последнего амперсанда может помочь. Хотя, у меня есть аналогичная проблема с другой командой, поэтому она, вероятно, не решит полностью ее. – bstempi
Исправление к моему комментарию: это бесполезно - nohup перенаправит вас, если вы не укажете иначе. Я заметил, что в этой библиотеке есть некоторые проблемы с потоками; возможно, вы столкнулись с одним? – bstempi
@ilfrin, Основной поток блокирует, потому что вы вызываете 'commandObject.join()' без таймаута. Это блокирует текущий поток для ожидания уведомления. Если вызываемая программа зависает, также висит основной поток. – Boyan