私は、コピージョブが完了するのを待つ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ん?
私はそれがここで馬鹿に見えるが、私はスクリプトを大幅に簡略化した。スリープコマンドが実際のプロセスであると想像してみてください。私がそれを切り離すのは、最終目標がこれらのコマンドのうちのいくつかを同時に実行するためです。 – gmate2008
私は10秒間遅れていないし、それが成功したと仮定します。全体のポイントは、予想よりも長くかかる場合でも、すべてのジョブが終了するまでwhileループにとどまることです。実際に上記のコードを実行すると、コマンドが終了したことがわかります(「コマンドが正常に実行されました:」と表示された後、whileループが「コピースクリプトはまだ動作しています...」)。 – gmate2008