5

Я хотел бы написать цикл ('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 ответа3

3

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

for i in $(seq 1 5); do \
 dd if=/dev/zero of=/tmp/disk$i bs=10M count=10 & \
done; wait

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


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

for i in $(seq 1 5); do \
 ( \
  echo "$i starting ..."; \
  dd if=/dev/zero of=/tmp/disk$i bs=10M count=10; \
  echo "$i done ..."; \
 ) & \
done; wait
2

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

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

1

Если у вас установлен 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .