2016-11-10 23 views
-1

私は、サーバをセットアップするときの人生を楽にするスクリプトを構築しています。私はそれが続行する前に完了するのプロセスを待つために私のスクリプトを取得しようとしていますBASHスクリプトがPIDを待つことができません

# Code to MV/CP/CHOWN files (working as intended) 
sudo su $INSTALL_USER -c \ 
    "sh $SOFTWARE_DIR/soa/Disk1/runInstaller \ 
    -silent -response $REPONSE_LOC/response_wls.rsp \ 
    -invPtrLoc $ORA_LOC/oraInsta.loc \ 
    -jreLoc /usr/java/latest" >&3 
SOA_PID = pgrep java 
wait $SOA_PID 
# Code below this which requires this be completed before execution. 

私はこのラインの問題を抱えています。

スクリプトは実行されますが、待機するのではなく続行され、スクリプトが終了した後にインストーラの実行が実行されます。私は、自分のプロセスを開始する前にこの部分をインストールする必要がある他のインストーラ部分を持っています。

私は$を使ってみました!このピースは別のユーザーによって実行されるため、それが機能するかどうかはわかりません。

ありがとうございます。

+1

http://shellcheck.netでもスクリプトを実行し、エラーを修正したときに戻ってきます。 – andlrc

+1

'SOA_PID = pgrep java'は' SOA_PID = $(pgrep java) 'のようにする必要があります - - つまり空白がなく、サブプロセス($(...)ビット)を呼び出します...そして、おそらく複数のJavaプロセスを処理する必要があるので、 'grep'は複数の値を返します..... – gilez

+0

バックグラウンドでスクリプトを実行していないので、待つことはありません。そして、プロセスは自分の子供だけを待つことができます - あなたが元のシェルの子ではなく 'su'が実行するシェルの子であるため、' su'によって実行されているプロセスを待つことはできません。 – Barmar

答えて

1

コマンドSOA_PID = pgrep javaはエラーになります。

はこのようにPIDをキャプチャするようにしてください:pgrepは、値を返さない 防止ナンセンスはさらに上起こった場合

SOA_PID=$(pgrep java) || exit 

|| exitは、出口を強制します。 もう1つの方法は、waitに直ちに返信して に頼ることですが、明示的にする方が良いでしょう。

関数内でこれを使用する場合は、代わりに|| returnを使用します(場合によっては )。

+0

@sorontarそれは答えに組み込まれ、それは私がとにかく好きなスタイルです。 –

関連する問題