Запускать одну и ту же команду несколько раз в фоновом режиме

14

Как можно запустить несколько команд и справиться с ними с помощью bash?

Например:

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

где wait - это пользовательский бинарный файл.

Прямо сейчас я получаю ошибку:

syntax error near unexpected token `;'

при запуске вышеуказанной команды.

После того, как задний план задан, команды должны работать параллельно.

Sebi
источник
1
Я полагаю, что вы не имеете в виду: nohupпозволяя вам выполнить команду в фоновом режиме
Дейв Гамильтон
3
Ошибка , которую вы видите из - за &и ;оба «команда терминаторов». Вам не нужно использовать оба: for ...; do wait $arg & doneбудет работать.
Гленн Джекман
@glenn Джекман. Да, я действительно попробовал это после публикации вопроса. Там нет необходимости для обоих; и &
Себи
3
Для будущих читателей ссылка на документацию : «Список - это последовательность из одного или нескольких конвейеров, разделенных одним из операторов ';', '&', '&&' или '||', и опционально завершенных одним ';', '&' или перевод строки. " (выделение мое)
Гленн Джекман
stackoverflow.com/q/14753491/560648
Гонки Легкости на орбите

Ответы:

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
Нужно использовать только внутренние скобки, если вы хотите поместить в фоновом режиме несколько команд, как указано в вопросе. Like ((сон 1; файл ожидания $ i) &);
Маз
2

Ваш бинарный файл действительно назван wait? Я не рекомендую делать это, потому что waitэто встроенная оболочка.

Я считаю, что bash плохо разбирает однострочный цикл, запускающий фоновые процессы. Я предлагаю вам изменить код на:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
Андерсон Медейрос Гомес
источник