2017-07-31 6 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の前提条件です。この場合、executeloadjava.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を参照してください。

関連する問題