2016-06-28 67 views
1

我正在嘗試創建一個等待複製作業完成的while循環。要獲得正在運行的作業的狀態,我正在使用: 作業-l | grep -c「正在運行」作業-l命令需要運行兩次才能更新?

我已將其簡化爲以下代碼。作業完成後,將打印出「成功執行的命令」。我看到的是工作完成,但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命令,e.g:

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

爲什麼工作-l沒有得到直接離開,當我execCmd函數完成更新?

回答

0

爲什麼要分離一個什麼也不做的睡眠命令?如果你想爲自己設置鬧鐘,那不是做到這一點的方法。 (你會睡覺,然後殺死-14 $$,但我離題了。)

雖然循環不循環額外的時間;它們只在條件成立時纔會循環。因此,你覺得應該是錯誤的條件,事實上是正確的。

因爲它是分離的,睡眠在第一次執行測試之前可能沒有開始。睡前一秒鐘可以節省自己的心痛。

+0

我意識到這看起來很愚蠢,但我大量簡化了腳本。想象一下,睡眠命令是一個真正的過程。我將它分開的原因是因爲最終目標是同時運行一些這些命令。 – gmate2008

+0

我不會延遲十秒,然後假設它已經工作。總的來說,它會留在while循環中,直到所有的工作都完成了,即使它們花的時間比預期的要長。如果你真的運行上面的代碼,你會看到命令完成(當它打印出「成功執行的命令:」,然後while循環將打印出一個額外的「複製腳本仍在工作...」。 – gmate2008

相關問題