我使用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();
當然,它啓動的過程開始。從shell執行的同一行也會立即返回。
任何想法爲什麼以及如何克服這一點?
編輯: 同樣的情況時,我不加入(),但讀命令的系統輸出(帶有公共-IO):
IOUtils.toString(commandObject.getInputStream()))
一個想法是重定向stdin和stderr,所以在最後一個&符號前放置'2&1'可能會有所幫助。雖然,我遇到了類似的問題,但它可能不會完全解決問題。 – bstempi 2014-01-23 20:02:13
糾正我的評論:這是無益的 - nohup會重定向你,如果你沒有另外指定。我注意到在這個lib中有一些線程問題;也許你遇到過一個? – bstempi 2014-01-24 17:54:59
@ilfrin, 主線程塊因爲你沒有超時而調用 'commandObject.join()'。這會阻止當前線程等待通知。如果被調用的程序掛起,主線程也會掛起。 – Boyan 2016-02-16 14:20:17