2017-07-31 73 views
1

我在Java上非常麻煩,所以請原諒我是否是一個虛擬問題。 我有以下一段代碼,和執行流程是從我的意圖不同:流程執行Java JSsh

channel = session.openChannel("shell"); 
OutputStream ops = channel.getOutputStream(); 
PrintStream ps = new PrintStream(ops, true); 

channel.connect(); 
String sudo = "sudo su - user"; 
String copy = "copy from a to b; 

String cd = "cd a directory"; 
String runload = "run a scrip in unix; 
String cd1 = "cd a directoryu"; 
String executeload = "run a scrip in unix"; 

ps.println(sudo); 
ps.println(copy); 
ps.println(cd); 
ps.println(runload); 
ps.println(cd1); 

if (db.runload().contains("SUCCESS")) { 
    ps.println(executeload); 

    //execute this only if runload was success 

} else { 
    System.exit(1); 
} 

的要點是,「如果塊」前行之前執行。 runload是加載表中的信息並且是executeload的先決條件的腳本。在這種情況下,executeload將拋出java.lang.NullPointerException

我的問題是:它是一種控制這段代碼流的方法嗎?以前的每條線都是下一條的前提條件。我的意圖是當電流最終執行時執行下一行。

+0

大多數時候,你不必擔心這一點。編譯器可以通過執行語句的順序來優化執行時間。 –

+0

就我而言,事關重大。我認爲的執行流程是按順序進行的,通過這種方式,每行代碼都是下一個代碼的先決條件。 – user3660050

回答

0

println只是發送(「類型」)命令到服務器。它不會等待命令完成。

實際上沒有辦法等待命令完成。 「外殼」只是一個帶有輸入和輸出的黑盒子。甚至沒有辦法知道,輸出的哪些部分對應於哪個輸入。

通常,您應該使用「exec」通道進行自動化。 「外殼」通道用於實現交互式終端。

「exec」通道關閉其命令,因此您可以清楚地知道命令已完成。然後您可以打開一個新的「exec」通道以獲取更多命令。

請參閱JSch example for "exec" channel


JSch Shell channel execute commands one by one testing result before proceeding見。


雖然使用sudo,但情況變得複雜。

參見Running command after sudo login