2016-04-19 9 views
0

jarファイルを起動してバックグラウンドで実行するためのbashスクリプトを作成しようとしています。そのため私はnohupを使用しています。今はjavaプロセスのpidを取得できますが、プロセスが終了したらコマンドを実行できるようにする必要もあります。プロセスIDを取得する方法と、プロセスがbashスクリプトで終了したときにトリガーを追加する方法はありますか?

これは私がまた;を使用すると、コマンドは最初の1が終了した後に実行させるだろうということthis answerから知っている

nohup java -jar jarfile.jar & echo $! > conf/pid 

を開始する方法です。

nohup java -jar jarfile.jar; echo "done" 

echo "done"は、単なる例に過ぎません。今私の問題は、それらをどのように組み合わせるのか分かりません。 echo $!を最初に実行すると、すぐにecho "done"が実行されます。 echo "done"が最初に行く場合、echo $!は、jarfileの1つではなくecho "done"というPIDを取得します。

PIDがもう表示されなくなるまで、ポーリングによって欲望の機能を達成できることは分かっています。しかし、私はできるだけそれを避けたいです。

答えて

2

あなたはnohup

nohup java -jar jarfile.jar & 
pid=$!  # Getting the process id of the last command executed 

wait $pid # Waits until the process mentioned by the pid is complete 
echo "Done, execute the new command" 
+0

はあなたにInianをありがとうございます。うまくいった –

1

を使用してプロセスを開始したら、私はあなたがpidはもはや動作して表示されないまで」ポーリングを周りに取得するつもりだとは思わないwait UTILのbashを使用することができます。 " waitはbashビルトインです。それはあなたが望むものであり、まさにそれが裏で何をするのか確信しています。しかし、Inianは私にそれを打ち負かすので、ここであなたのためのフレンドリーな機能があります(あなたがいくつかのことを並行して実行したい場合)。

alert_when_finished() { 
    declare cmd="${@}"; 
    ${cmd} & 
    declare pid="${!}"; 
    while [[ -d "/proc/${pid}/" ]]; do :; done; #equivalent to wait 
    echo "[${pid}] Finished running: ${cmd}"; 
} 

このようなコマンドを実行すると、所望の効果を与え、不要なジョブ出力を抑制します:

(alert_when_finished 'sleep 5' &) 
関連する問題