Виконати команду bash після деяких одночасних команд?


13

Я хочу виконати кілька команд паралельно. Після завершення всіх цих команд запустіть наступну. Я хоч наступний підхід спрацює

#!/bin/bash
command1 &
command2 &
command3 &&
command4

але це не сталося Мені потрібно запустити, command4коли всі перші три команди будуть повністю закінчені.

Відповіді:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (без жодних аргументів) буде чекати, поки всі фонові процеси не завершаться.

Повний опис waitв bashкерівництві:

wait [-n] [n ...]

Зачекайте кожного зазначеного дочірнього процесу та поверніть його статус припинення. Кожен nможе бути ідентифікатором процесу або специфікацією завдання; якщо задана специфікація роботи, всі процеси в трубопроводі цієї роботи чекають. Якщо nне вказано, очікуються всі поточно активні дочірні процеси, а стан повернення дорівнює нулю. Якщо -nопція надана, waitчекає припинення будь-якої роботи і повертає свій вихідний статус. Якщо nвказано неіснуючий процес або завдання, стан повернення - 127. В іншому випадку стан повернення - це вихід виходу останнього очікуваного процесу або завдання.


1
Ще один варіант - зберегти PID кожної дитини, використовуючи щось на зразок, PID1=$!а потім зачекати всіх із ними wait "$PID1" "$PID2" "$PID3". Це трохи складніше, але вийде, якщо в процесі є інші діти, яких ви не хочете чекати.
kasperd

1
@kasperd Краще з масивом у цьому випадку: cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"або щось подібне.
Кусалаланда

@kasperd Під "краще" я маю на увазі "використовує лише одну змінну". Нічого не суттєво неправильно з використанням багатьох, і, мабуть, абсолютно нормально для таких маленьких випадків.
Кусалаланда

0

Мені подобається waitвідповідь, але як академічна вправа, я думаю, це також спрацює:

bash -c 'command1 & command2 & command3 &' && command4

Будь ласка, виправте мене, якщо я помиляюся.


2
Ви тестували це? Це абсолютно не працює. Приклад: time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo Якщо в ньому не сказано, що команда bash зайняла п'ять секунд, вона не зробить те, що ви хочете.
Сет Робертсон

Я перевірив це на сон і відгомони, і, здавалося, це працює. Ваш приклад доводить інше.
бургер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.