2016-06-28 4 views
1

Я пытаюсь создать цикл while, который ждет завершения задания на копирование. Чтобы получить статус выполняемых заданий, я использую: jobs -l | grep -c "Running"jobs -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 дважды, например:

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

Почему работа -l не обновляется сразу, когда моя функция execCmd заканчивается?

ответ

0

Почему вы отключаете команду сна, которая ничего не делает? Если вы хотите настроить будильник для себя, это не способ сделать это. (Вы бы спали, а затем убили -14 $$, но я отвлекся.)

В то время как петли не зацикливаются на дополнительное время; они только петля, пока условие истинно. Таким образом, условие, которое, по вашему мнению, должно быть ложным, на самом деле истинно.

Поскольку он отсоединен, сон может не начаться до первого испытания во время выполнения теста. Вы можете сберечь себя от сердечной боли, спя в течение одной секунды перед тестом.

+0

Я понимаю, что здесь выглядит глупо, но я значительно упростил сценарий. Представьте, что команда сна - это то, что является реальным процессом. Причина, по которой я отключаю его, заключается в том, что конечной целью является выполнение нескольких из этих команд одновременно. – gmate2008

+0

Я не откладываю на десять секунд, а затем предполагаю, что он сработал. Все дело в том, что он останется в цикле while, пока все задания не закончатся, даже если они занимают больше времени, чем ожидалось. Если вы на самом деле выполняете вышеуказанный код, вы увидите, что команда завершает работу (когда она печатает «успешно выполненную команду:», а затем цикл while будет печатать один дополнительный «скрипт копирования все еще работает ...». – gmate2008