Как использовать параллель GNU с командой синхронизации aws?
У меня есть файл со следующими командами:
aws s3 cp ./test s3://test --recursive --content-encoding "gzip" --content-type "text/html" --cache-control "max-age=$MAXAGE" --exclude "*" --include "*.html" --profile $PROFILE
aws s3 cp ./test s3://test $S3BUCKET --recursive --content-encoding "gzip" --content-type "text/html" --cache-control "max-age=$MAXAGE" --exclude "*" --include "*.css" --profile $PROFILE
Как я могу использовать GNU parallel для параллельного запуска этих команд?
Что я сделал, так это добавил команды в файл с именем test.sh.
и я запускаю следующую команду
parallel < test.sh
] Как передать аргументы в файл test.sh? Например, я хочу передать имя корзины aws.
Ответ 1 · рейтинг 2 · Charles Duffy
Если ваша цель состоит в том, чтобы вызвать сбой сценария в случае сбоя любого члена набора написанных от руки команд, GNU parallel не лучший инструмент для этой работы: сама оболочка уже предоставляет все необходимое с помощью команды wait, который указан в POSIX и присутствует во всех оболочках, совместимых со стандартами (см. также спецификацию , требующую, чтобы он был реализован как встроенный).
#!/bin/bash
# ^^^^- Important! /bin/sh doesn't have arrays; bash, ksh, or zsh will work.
# For readability, put common arguments in an array
common_args=(
--recursive
--content-encoding "gzip"
--content-type "text/html"
--cache-control "max-age=$MAXAGE"
--exclude "*"
--profile "$PROFILE"
)
# Record PIDs of the various jobs in an array
pids=( )
aws s3 cp ./test s3://test --include='*.html' "${common_args[@]}" & pids+=( $! )
aws s3 cp ./test s3://test "$S3BUCKET" --include='*.css' "${common_args[@]}" & pids+=( $! )
# If either background job failed, exit the script with the same exit status
for pid in "${pids[@]}"; do
wait "$pid" || exit
done
Обратите внимание, что массивы используются выше для удобства, а не по необходимости; вы можете предоставить общие аргументы с помощью функции и/или создать массив PID в скалярной переменной или переопределив "$@" внутри функции оболочки, если вашей целью было написать код, который будет работать на любой базовой оболочке POSIX.
Ответ 2 · that other guy
Вы можете сделать это, экспортировав все необходимые переменные, а затем передав команды в parallel с цитируемой здесь документацией:
#!/bin/bash
export S3BUCKET="$1"
export MAXAGE=42
export PROFILE=foobar
parallel --gnu << 'EOF'
aws s3 cp ./test s3://test --recursive --content-encoding "gzip" --content-type "text/html" --cache-control "max-age=$MAXAGE" --exclude "*" --include "*.html" --profile $PROFILE
aws s3 cp ./test s3://test $S3BUCKET --recursive --content-encoding "gzip" --content-type "text/html" --cache-control "max-age=$MAXAGE" --exclude "*" --include "*.css" --profile $PROFILE
EOF