В этом случае было бы лучше использовать только -name 'proc *'
, которое использует подстановку и выполняет поиск только по имени файла (в отличие от -regex
, который выполняет поиск по всему каталогу записи, ведущие к имени файла).
Если вы настаиваете на использовании -regex
, используя жадность:
find . -type f -regex '.*/proc[^/]*$'
Если вы вставите что-то вроде следующего сегмента кода между двумя циклами 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
Используйте встроенную функцию fg
. Он ожидает завершения фоновых процессов.
За подробностями обращайтесь к help fg
.
Вы можете использовать команду 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"
Несколько моментов:
Если ваша цель с nohup
- не допустить, чтобы удаленный выход оболочки убивал ваши рабочие процессы, вы следует использовать nohup
в самом скрипте, а не в отдельных рабочих процессах, которые он создает.
Как объясняется здесь , nohup
только предотвращает получение процессами SIGHUP и взаимодействие с терминалом, но не нарушает отношения между оболочкой и ее дочерними процессами.
В связи с вышеизложенным, с nohup
или без него, простое ожидание
между двумя циклами for
вызовет второй for
] будет выполняться только после завершения всех дочерних процессов, запущенных первым для
.
С простым ожиданием
:
ожидаются все активные в данный момент дочерние процессы, и статус возврата равен нулю.
Если вам нужно запустить второй для
только в том случае, если в первом не было ошибок, тогда вам нужно сохранить каждый рабочий PID с помощью $!
и передать их все wait
:
pids =
для ...
worker ... &
pids + = "$ ! "
готово
подождите $ pids || {echo "были ошибки"> & 2; выход 1; }