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


14

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

Например:

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

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

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

syntax error near unexpected token `;'

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

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


1
Я полагаю, что вы не имеете в виду: nohupпозволяя вам выполнить команду в фоновом режиме
Дейв Гамильтон

3
Ошибка , которую вы видите из - за &и ;оба «команда терминаторов». Вам не нужно использовать оба: for ...; do wait $arg & doneбудет работать.
Гленн Джекман

@glenn Джекман. Да, я действительно попробовал это после публикации вопроса. Там нет необходимости для обоих; и &
Себи

3
Для будущих читателей ссылка на документацию : «Список - это последовательность из одного или нескольких конвейеров, разделенных одним из операторов ';', '&', '&&' или '||', и опционально завершенных одним ';', '&' или перевод строки. " (выделение мое)
Гленн Джекман

Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.