Я пытаюсь создать цикл 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 заканчивается?
Я понимаю, что здесь выглядит глупо, но я значительно упростил сценарий. Представьте, что команда сна - это то, что является реальным процессом. Причина, по которой я отключаю его, заключается в том, что конечной целью является выполнение нескольких из этих команд одновременно. – gmate2008
Я не откладываю на десять секунд, а затем предполагаю, что он сработал. Все дело в том, что он останется в цикле while, пока все задания не закончатся, даже если они занимают больше времени, чем ожидалось. Если вы на самом деле выполняете вышеуказанный код, вы увидите, что команда завершает работу (когда она печатает «успешно выполненную команду:», а затем цикл while будет печатать один дополнительный «скрипт копирования все еще работает ...». – gmate2008