Я хочу выполнять команды в цикле одновременно, а не по порядку

Я хотел бы написать цикл ('for'), который будет выполнять какое-то действие 'X' несколько раз. Но вместо того, чтобы выполнять действия последовательно, одно за другим, я бы хотел, чтобы они выполнялись одновременно (в parellel одновременно). Как этого достичь? Сценарий или один лайнер в порядке.

Пример ТОЛЬКО:

for i in 1 2 3 4 5; do dd if=/dev/zero of=/tmp/disk$i bs=10M count=10; done

3 ответа

Решение

Это в основном ответ Dennis дал (+1 там), с вашим примером.

для я в $(след. 1 5); делать \
 dd if=/dev/zero of=/tmp/disk$i bs=10M count=10 & \
сделанный; Подождите

'\"И новые строки просто для удовольствия от чтения, вы можете написать все это в одну строку.


Это дает лучшее понимание последовательности управления и синтаксиса,

для я в $(след. 1 5); делать \
 ( \
  эхо "$ я начинаю..."; \
  дд если =/dev/zero of=/tmp/disk$i bs=10M count=10; \
  echo "$i done ..."; \) & \
сделанный; Подождите

Добавить амперсанд (&) в конце dd Команда, чтобы каждый из них работал в фоновом режиме и добавить ; wait после done,

В некоторых случаях, xargs --max-args=MAX-ARGS --max-procs=MAX-PROCS может быть использован.

Если у вас установлен GNU Parallel http:// www.gnu.org/software/parallel/, вы можете сделать это:

seq 1 5 | parallel dd if=/dev/zero of=/tmp/disk{} bs=10M count=10

Посмотрите вступительное видео для GNU Parallel, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Другие вопросы по тегам