запрос выполняется параллельно для сценариев цикла

После копирования ключей к удаленной машине и вставлению их authorized_keys необходимо сделать что-то вроде этого:

ssh-agent bash
ssh-add ~/.ssh/id_dsa or id_rsa
3
05.11.2015, 17:13
3 ответа

Можно предположить, что «60 секунд» (и даже «5 минут») - всего лишь хорошая оценка, и что существует риск, что первая партия все еще выполняется, когда запускается вторая партия. Если вы хотите разделить партии (и если нет проблем, кроме случайных перекрытий файлов журнала), лучшим подходом было бы указать номер партии как часть соглашения об именах файлов в процессе разработки.

Примерно так:

[[ -s ]] $local_dir/batch || echo 0 > $local_dir/batch
batch=$(echo $local_dir/batch)
expr $batch + 1 >$local_dir/batch

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

[[ -f "$file" ]] || continue

, и используйте номер пакета в имени файла:

mv $file_location $local_dir/in_progress$batch.log

и для вперед. Это снижает риск столкновения.

2
27.01.2020, 21:19

Совпадение многократно описано в разделе 27,4 Совпадение многократно главы 27 руководства пользователя (см. : help usr_27.txt).

Следующая команда удаляет первые 9, 10 или 11 символов строки 3, если строка содержит не менее 9 символов. Если строка содержит меньше символов, она возвращает E486: Образец не найден:

:3s/.\{9,11}//

Не уверен, что это то, что вы хотите, если не обновить ваш вопрос, пожалуйста.

-121--216805-
$ sed -n 's/.*{\(.*\)}.*/\1/p' file
information to be captured

Как это работает

  • -n

    Это говорит sed не печатать ничего, если мы явно не просим его.

  • s/. * {\(. *\)}. */\1/p

    Эта команда замены захватывает как группу 1 все между двумя фигурными скобками. Вся строка заменяется группой 1, обозначаемой \1 . В конце p сообщает sed, что если совпадение было выполнено, он должен распечатать результат.

-121--145309-

Другой способ - реализовать простую пакетную очередь в сценарии.

В начале сценария можно было сделать что-то подобное:

mkdir -p $localdir/batch
BATCHTMP=$(mktemp batch.XXXXXXXXXX)
MYBATCH="$localdir/batch/batch.$$"

# get list of current log files
find $local_dir/ -name 'myfile.log.*' > "$BATCHTMP"

# exclude any log files already in other batches
grep -vF -f <(sort -u $localdir/batch/batch.*) < "$BATCHTMP" > "$MYBATCH"

rm -f "$BATCHTMP"

# only process log files that are in my batch
for lf in $(cat "$MYBATCH") ; do
....
# somewhere in here, mv or rm the logfile being processed
# so it doesn't get processed again in a later batch run
done

rm -f "$MYBATCH"

Это, конечно, только простой набросок того, что нужно сделать.

BTW, это также может быть сделано в сценарии оболочки, который не делает ничего, кроме как создать пакетный файл и затем запустить основной сценарий.

1
27.01.2020, 21:19

Выше есть ответ, который предлагает несколько хороших решений проблемы, но я решил дать небольшое объяснение почему того, в чем проблема.

По большей части: пока ваши переименованные файлы журналов (те, что в процессе) не соответствуют критериям, вы вероятно можете запускать это с минимальным риском. Однако вы все равно получите несколько ошибок...

Ваш список файлов генерируется при запуске скрипта. В итоге произойдет следующее:

Сценарий A получает список из 10 файлов. Начинает обработку, 5 файлов в списке (осталось 5) скрипт B получает список из 5 оставшихся файлов, начинает обработку. Скрипт a переходит к обработке следующего файла в списке (который совпадает с файлом, который начал обрабатывать скрипт B) и выдает ошибку, так как файл был переименован. Таким образом, с обработкой ошибок, теоретически, он мог бы перейти к следующему в своем списке файлу и работать без проблем. Но, очевидно, ВСЕГДА есть шанс, что звезды сойдутся, скрипты попадут в один и тот же файл в одно и то же время, и произойдет что-то неожиданное. Взвесьте этот риск, как вам будет угодно.

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

1
27.01.2020, 21:19

Теги

Похожие вопросы