2009-10-03 3 views
1

Я хочу обновить большое количество проектов с поддержкой SVN сразу, используя скрипт. Это займет очень много времени при выполнении заданий обновления по одному.Linux: Это правильный способ запуска скриптов параллельно?

Поэтому я попытался выполнить задания параллельно. Кажется, что работает, однако я не уверен , если все сделано правильно. Возможно, есть проблемы параллелизма, о которых я не думал?

Пожалуйста, обратите внимание на сценарий:

#!/bin/sh 

time (
    for f in `ls -d */` 
    do 
     (
      OUTPUT=`svn update $f` 
      echo -e "= = = = = = = = = = $f \n$OUTPUT" 
     ) & 
    done 

    wait 
) 

Когда я не храним выход первых, речь идет все смешалось.

Как вы думаете, все в порядке?

ПРИМЕЧАНИЕ. Ускорение на самом деле было около 20 факторов для 40 проектов, когда обновления не много.

+0

Ну, я не уверен, что теперь правильно? Ответ от ** Pavel Shved **, или от ** ijw **? –

ответ

0

Все должно быть хорошо. Трудно ли на жестком диске делать такие параллельные обновления? Это может произойти, если у вас есть много изменений в обновлении.

+0

Я сделал синхронизацию впоследствии, иногда занимает 10 секунд;) –

1

Да, это нормально, что выход смещается во время параллельного выполнения, если не сделаны специальные меры предосторожности (например, сохранение вывода в вашем случае).

Консоль не ждет появления всего вывода команды. Обратите внимание, что при запуске svn update без каких-либо параллельных строк строки печатаются один за другим, так как Subversion извлекает и объединяет файлы. Поэтому, когда два одновременных вызова svn работают, каждый из них хочет печатать один за другим, а выход представляет собой смесь строк, напечатанных ими.

5

Ваш результат все равно будет запутан, если два задания будут выполнены в одно и то же время. Вы бы лучше писать вывод в файлы, а затем cat'ting файлы в конце прогона:

#!/bin/sh 
outdir="/tmp/output$$" # probably ought to be chosen with e.g. mktemp 

trap 'rm -rf "$outdir"' EXIT # Clean up on exit, even if Ctrl-C 

time (
    mkdir "$outdir" 
    for f in `ls -d */` # You have issues with filenames with space in, here 
    do 
      (
        echo -e "= = = = = = = = = = $f" 
        svn update "$f" 
      ) > "$outdir/$f" & 
    done 

    wait 
    cat "$outdir"/* 
) 

Помимо этого, мое беспокойство будет то, что вы не ограничивая число рабочих мест вы запускаете явно, но этого довольно сложно добиться в сценарии оболочки. Предоставляя вам уверенность, что вы смотрите на 40 каталогов, а не, скажем, на 10 000, я не вижу в этом слишком большой проблемы.

+0

Итак, вы указываете, что две «параллельные» команды эха, которые печатают много текста, могут быть перемешаны консолью? –

+0

Да. Я не думаю, что «эхо» является атомарным. Тем не менее, быстрый тест, который я только что запускал с файлами 1 МБ, предполагает, что он может быть достаточно близко к атомному, что вам все равно ... – ijw

+0

Нет, эхо не является атомарным. У вас есть N процессов с STDOUT, связанных с одним и тем же файловым дескриптором (STDOUT сценария оболочки). В приведенном выше примере добавляется дескриптор файла, связанный с STDOUT в подоболочке до его запуска, поэтому каждая команда эхо имеет свой собственный дескриптор. – dannysauer

Смежные вопросы