2017-07-20 12 views
1

すべて、条件が満たされるとBash関数がハングします

私はいくつかのサブプロセスを起動するbashスクリプトを実行しようとしています。プロセスは独自のログファイルにリダイレクトされ、それらを並行して実行する必要があります。これを行うには、同じ親PIDを使用するプロセスの数を監視するcheck_procsプロシージャを作成しました。番号が再び1に達すると、スクリプトは続行する必要があります。しかし、それはちょうどハングアップしているようです。私がなぜわからないが、コードは以下の通りです:プロセスがキックオフされた後

check_procs() { 
    while true; do 

    mypid=$$ 
    backup_procs=`ps -eo ppid | grep -w $mypid | wc -w` 

    until [ $backup_procs == 1 ]; do 
     echo $backup_procs 
     sleep 5 
     backup_procs=`ps -eo ppid | grep -w $mypid | wc -w` 
    done 

    done 

} 

この関数が呼び出されて、私はそれがプロセスの数からエコーが、その後エコー停止を示唆している(参照することができます関数はプロセスのカウントが1になってから完了しましたが、何も起こらず、スクリプトがサーバーのプロセスリストにまだ残っているのを見ることができます。

for ((i=1; i <= $threads; i++)); do 

    <Some trickery here to generate $cmdfile and $logfile> 

    nohup rman target/cmdfile=$cmdfile log=$logfile & 

    x=$(($x+1)) 

done 

check_procs 

$スレッドスクリプトに渡されるコマンドラインパラメータであり、のように、これらはnohupを使用してキックオフされた4または6のような小さい数であります表示されます。 check_procsのIFが満たされると、残りのスクリプトを実行する代わりにすべてがハングします。私の機能に何が問題なのですか?

+0

デバッグするときに、いくつかの 'echo'sをスティックします。 untilループの前に 'echo '、backup_procs == $ backup_procs"、 'echo" untilループ "'、 '' untilループの後に ''など '私はあなたの' while true'が永遠に起こっていると思っています – slim

+1

あなたは決して終了しないあなたの真のループです。どこかでブレークを追加する必要があります – Pawamoy

+0

https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script bashスクリプトをデバッグするには – skr

答えて

0

私は間違っているかもしれませんが、それは予想されていませんか?外側のループは永遠に実行され、終了点はありません。プロセス数が再び増加しない限り、外側のループは無限に実行されます(遅延はありませんが推奨されません)。

+0

私はこれを考え出しました。問題であり、私は、内側のループですが、これは問題を解決しませんでした。それでもハングアップし続けました。私はその後、私の出口が間違った場所にあることに気付き、それを取り除いた。私は今、私はある種の休憩をとる必要があることを認識していますが、何が分からないのでしょうか? –

+0

これをありがとう、私は光を見て、whileループにブレークを追加しました。このような単純なエラーは、今はとても愚かなようです! –

+0

私はしばしば自分のコードで同じ奇妙な盲点を持っています。 :) BTW:$ backup_procs == 1(resource eater)の場合、完全な速度でループを実行しないようにするために、外側ループに 'sleep'を追加するべきでしょう。 – goteguru

関連する問題