Linux: это правильный способ параллельного запуска скриптов? - PullRequest
1 голос
/ 03 октября 2009

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

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

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

#!/bin/sh

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

    wait
)

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

Как вы думаете, это нормально?

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

Ответы [ 3 ]

5 голосов
/ 03 октября 2009

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

#!/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, я не вижу в этом особой проблемы.

1 голос
/ 03 октября 2009

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

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

0 голосов
/ 03 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...