
Предположим, у меня есть несколько запущенных фоновых задач, но теперь я хочу запустить еще две фоновые задачи, но дождаться только последних двух. Например:
# long running commands
sleep 60 &
sleep 60 &
# now wait only for these two:
sleep 5 & sleep 5 & wait; echo waited only for the 5s sleeps.
Результатом выполнения команды выше является ожидание команды echo в течение 60 секунд.
я знаю что могупередайте pid или jobid для ожидания. Но поскольку я запускаю процессы в for
цикле, я не могу легко получить PID.
Я попробовал это, но безуспешно:
{ sleep 3 & sleep 5 & } wait; echo did not wait :
sleep 10 & { sleep 3 ; sleep 3 ; }& wait %2; echo only wait 3s
PS: Этот вопрос является продолжениемэтот более простой вопрос.
решение1
Вы можете запустить подоболочку:
{ sleep 20 && echo second output ; }
( sleep 2 & wait && echo first output )
Команда wait
в подоболочке будет действительна только там.
решение2
На основе указаний @Kusalananda в более простом вопросе я придумал этот пример. Может быть, не самый простой...
Весь код ниже находится в интерактивной оболочке. Я просто разбил его на части для ответа, потому что иначе его было бы трудно читать.
Обратите внимание, что в bash
версии 4.1 и более ранних версиях !
в ""
, вызывает замену истории в интерактивной оболочке (это было исправлено в версии 4.2). Вот на что я попался. Если вы действительно хотите цитировать, $!
вы можете использовать "$! "
, а завершающий пробел предотвратит срабатывание замены истории.
unset to_wait;
date;
sleep 3 &
for i in 1 2 3; do
sleep 1 &
# Don't put the ! in "" or you'll get an `event`.
to_wait+=( $! );
done;
wait "${to_wait[@]}";
date;
echo waited 1s for inner processes;
# wait for the rest of the processes (just for illustration)
wait;
date;
echo waited 3s for outer process;