Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как использовать GNU Parallel

Автор вопроса: James UmerisОтветов: 2

Как использовать параллель 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.

  • Если вы просто хотите запустить несколько команд параллельно, используйте & вместо GNU parallel. that other guy 17.11.2015
  • который запускает его в фоновом режиме. Мне нужен GNU-параллель, чтобы при сбое одной команды не удавалось все James Umeris 17.11.2015
  • Вы имеете в виду, что хотите поведения --halt 2? that other guy 17.11.2015
  • Что делает останов --2? James Umeris 17.11.2015
  • --halt 2 - это параллельная опция GNU, которая уничтожает все задания в случае сбоя одного из них. --halt 1 просто больше не выполняет никаких заданий, а это то, что & выполнит. that other guy 17.11.2015
  • Это не отвечает на мой вопрос. Как я могу использовать GNu parallel для запуска вышеуказанных команд? James Umeris 17.11.2015

bashparallel-processinggnugnu-parallel

Ответы

Ответ 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы