2016-06-28 7 views
1

私は、コピージョブが完了するのを待つwhileループを作成しようとしています。実行中のジョブのステータスを取得するには、私が使用しています: jobs -l | grep -c "Running"jobs -lコマンドを更新するために2回実行する必要がありますか?

私は以下のコードに簡略化しました。ジョブが完了すると、「正常に実行されたコマンド」が印刷されます。私が見ていることは、仕事が完了したことですが、whileループは常に余分なループを行います。

#!/usr/bin/ksh 
execCmd() 
{ 
    $* 
    if [ $? -ne 0 ] 
    then 
     exit 
    else 
     echo "successfully executed command: \"$*\"" 
    fi 
} 

execCmd "sleep 10"& 

NPROC=`jobs -l | grep -c "Running"` 

while [[ $NPROC != "0" ]]; do 
    echo "$NPROC copy script is still working..." 
    sleep 2 
    NPROC=`jobs -l | grep -c "Running"` 
    echo $NPROC 
done 

私はこの問題を解決することが判明している唯一の方法は二回jobs -lコマンドを実行することです、例えば:私のexecCmd機能が終了すると

jobs -l 
NPROC=`jobs -l | grep -c "Running"` 

はなぜジョブがすぐに更新されませ-lん?

答えて

0

なぜ何もしないスリープコマンドを切り離していますか?自分でアラームを設定したい場合は、それを行う方法ではありません。 (あなたは眠って-14 $$を殺すでしょうが、私は逃げます。)

whileループは余分な時間をループしません。条件が真である間だけループします。したがって、あなたが偽であると感じる条件は、実際には真実です。

テストが実行される前にスリープが開始されていない可能性があります。あなたはテストの前に1秒間寝て自分自身を救うことができます。

+0

私はそれがここで馬鹿に見えるが、私はスクリプトを大幅に簡略化した。スリープコマンドが実際のプロセスであると想像してみてください。私がそれを切り離すのは、最終目標がこれらのコマンドのうちのいくつかを同時に実行するためです。 – gmate2008

+0

私は10秒間遅れていないし、それが成功したと仮定します。全体のポイントは、予想よりも長くかかる場合でも、すべてのジョブが終了するまでwhileループにとどまることです。実際に上記のコードを実行すると、コマンドが終了したことがわかります(「コマンドが正常に実行されました:」と表示された後、whileループが「コピースクリプトはまだ動作しています...」)。 – gmate2008

関連する問題