приостановка сценария bash до завершения предыдущих команд

В этом случае было бы лучше использовать только -name 'proc *' , которое использует подстановку и выполняет поиск только по имени файла (в отличие от -regex , который выполняет поиск по всему каталогу записи, ведущие к имени файла).

Если вы настаиваете на использовании -regex , используя жадность:

find . -type f -regex '.*/proc[^/]*$'
20
22.08.2016, 17:59
4 ответа

Если вы вставите что-то вроде следующего сегмента кода между двумя циклами for , это может помочь.

flag=0

while [ flag -eq 0 ]
do
  ps -ef | grep "Rscript --vanilla" | grep -v grep > /dev/null
  flag=${?}
  sleep 10
done

Конечно, если ваше приложение Rscript имеет шанс не завершиться успешно и задержится, ваш второй цикл for может не запуститься. Приведенный выше сегмент кода предполагает, что все процессы с идентификатором Rscript --vanilla завершатся и исчезнут должным образом. Не зная, что делает ваше приложение и как оно работает, я вынужден полагаться на это предположение.

РЕДАКТИРОВАТЬ

В свете комментариев это лучше соответствует вашим потребностям. (он включает ваш исходный код, а также логику проверки завершения)

for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
pids[$i]=${!}
done

flag=0

while [ flag -eq 0 ] 
do
  for PID in $(echo ${pids[@]})
  do
    flag=1
    ps -ef | grep ${PID} | grep -v grep >/dev/null; r=${?}
    if [ ${r} -eq 0 ]
    then 
      flag=0
    fi
  done
done

for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done
0
27.01.2020, 19:44

Используйте встроенную функцию fg . Он ожидает завершения фоновых процессов.

За подробностями обращайтесь к help fg .

-1
27.01.2020, 19:44

Вы можете использовать команду wait , чтобы сделать это за вас. Вы можете либо захватить все идентификаторы дочерних процессов и ждать их специально, или, если они являются единственными фоновыми процессами, создаваемыми вашим скриптом, вы можете просто вызвать wait без аргументов. Например:

#!/bin/bash
# run two processes in the background and wait for them to finish

nohup sleep 3 &
nohup sleep 10 &

echo "This will wait until both are done"
date
wait
date
echo "Done"
40
27.01.2020, 19:44

Несколько моментов:

  • Если ваша цель с nohup - не допустить, чтобы удаленный выход оболочки убивал ваши рабочие процессы, вы следует использовать nohup в самом скрипте, а не в отдельных рабочих процессах, которые он создает.

  • Как объясняется здесь , nohup только предотвращает получение процессами SIGHUP и взаимодействие с терминалом, но не нарушает отношения между оболочкой и ее дочерними процессами.

  • В связи с вышеизложенным, с nohup или без него, простое ожидание между двумя циклами for вызовет второй for ] будет выполняться только после завершения всех дочерних процессов, запущенных первым для .

  • С простым ожиданием :

    ожидаются все активные в данный момент дочерние процессы, и статус возврата равен нулю.

  • Если вам нужно запустить второй для только в том случае, если в первом не было ошибок, тогда вам нужно сохранить каждый рабочий PID с помощью $! и передать их все wait :

     pids = 
    для ... 
    worker ... & 
    pids + = "$ ! "
    готово 
    подождите $ pids || {echo "были ошибки"> & 2; выход 1; } 
     
14
27.01.2020, 19:44

Теги

Похожие вопросы