如何使用 GNU 并行
How to use GNU Parallel
如何将 GNU 与 aws sync 命令并行使用?
我有一个包含以下命令的文件:
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 来并行执行 运行 这些命令?
我所做的是将命令添加到名为 test.sh
的文件中
我运行下面的命令
parallel < test.sh
]
如何将参数传递给 test.sh 文件?比如我想传入aws bucket name.
您可以通过导出所有必需的变量然后将命令传送到 parallel
并引用此处记录的内容来执行此操作:
#!/bin/bash
export S3BUCKET=""
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
如果您的目标是在一组手写命令的任何成员失败时触发脚本失败,那么 GNU parallel 并不是完成这项工作的最佳工具:shell 本身已经提供了所需的一切使用 wait
命令,which is specified by POSIX and present out-of-the-box on all standards-compliant shells (see also the specification requiring it to be implemented as a builtin).
#!/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
请注意,上面使用数组是为了方便,而不是必须;您可以提供带有函数的公共参数,and/or 在标量变量中构建 PID 数组,或者如果您的目标是编写可行的代码,则通过覆盖 shell 函数中的“$@”在任何 POSIX 基线 shell.
如何将 GNU 与 aws sync 命令并行使用?
我有一个包含以下命令的文件:
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 来并行执行 运行 这些命令?
我所做的是将命令添加到名为 test.sh
的文件中我运行下面的命令
parallel < test.sh
] 如何将参数传递给 test.sh 文件?比如我想传入aws bucket name.
您可以通过导出所有必需的变量然后将命令传送到 parallel
并引用此处记录的内容来执行此操作:
#!/bin/bash
export S3BUCKET=""
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
如果您的目标是在一组手写命令的任何成员失败时触发脚本失败,那么 GNU parallel 并不是完成这项工作的最佳工具:shell 本身已经提供了所需的一切使用 wait
命令,which is specified by POSIX and present out-of-the-box on all standards-compliant shells (see also the specification requiring it to be implemented as a builtin).
#!/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
请注意,上面使用数组是为了方便,而不是必须;您可以提供带有函数的公共参数,and/or 在标量变量中构建 PID 数组,或者如果您的目标是编写可行的代码,则通过覆盖 shell 函数中的“$@”在任何 POSIX 基线 shell.