Виконайте одну і ту ж команду кілька разів у фоновому режимі


14

Як можна запускати декілька команд та тло їх використовувати bash?

Наприклад:

$ for i in {1..10}; do wait file$i &; done

де чекати - це звичайний двійковий файл.

Зараз я отримую помилку:

syntax error near unexpected token `;'

при виконанні вищевказаної команди.

Після фонових команд команди повинні виконуватися паралельно.


1
Я не вважаю, nohupщо ви можете виконувати команду у фоновому режимі
Дейв Гамільтон

3
Помилка , яку ви бачите з - за &і ;обидва «команда термінаторів». Не потрібно використовувати обидва: for ...; do wait $arg & doneбуде працювати.
glenn jackman

@glenn jackman. Так, я насправді спробував це після публікації запитання. Для обох немає потреби; і &
Себі

3
Для майбутніх читачів посилання на документацію : "Список - це послідовність одного або декількох трубопроводів, розділених одним з операторів ';', '&', '&&' або '||', і необов'язково закінчується одним of ';', '&' або новий рядок. " (наголос мій)
glenn jackman

Відповіді:


21

Так &само, як ;і оператор терміналу списку . Вони мають однаковий синтаксис і можуть використовуватися взаємозамінно (залежно від того, що ви хочете зробити). Це означає, що ви не хочете і не потребуєте command1 &; command2всього, що вам потрібно command1 & command2.

Отже, у своєму прикладі ви могли просто написати:

for i in {1..10}; do wait file$i & done

і кожна waitкоманда буде запущена у фоновому режимі, і цикл негайно перейде до наступної.


4

Для сумісності використовуйте форму posix замість розширення:

for i in $(seq 1 10); do (./wait file$i &); done

1
Зауважте, що seqце не команда POSIX, і вона зазвичай зустрічається лише в системах GNU. Поведінка або $(...)$i) залежить від поточного значення $IFS. Також зауважте, що, виконуючи це (cmd &), cmdви будете дочірньою базою, тому вам не вдасться чекати та отримати статус виходу, наприклад.
Стефан Шазелас

2

Ви можете згрупувати команди та покласти згруповані команди на задній план. Подобається :

$ for i in {1..10}; do ((wait file$i)&); done

Не потрібно використовувати внутрішні дужки ...
marc

використовувати внутрішні дужки потрібно лише в тому випадку, якщо ви хочете поставити на задньому плані кілька команд, як задано в питанні. Як ((сп. 1; зачекайте файл $ i) &);
маз

2

Чи справді названий ваш двійковий файл wait? Я не рекомендую цього робити, бо waitвбудована оболонка.

Я вважаю, що bash не добре розбирає однолінійний цикл, який запускає фонові процеси. Я пропоную вам змінити код на:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.