【发布时间】:2017-10-22 04:41:52
【问题描述】:
编者注:这是关于running a specified number of commands in parallel 的更一般问题的后续问题。
我正在尝试为 20 个 mongodb 服务器运行这个 mongodb 备份脚本。
#!/bin/bash
#daily backup for mongo db's
BACKUP_HOSTS=(example.com staging.example.com prod.example.com example1.com)
#d=$(date +%Y-%m-%dT%H:%M:%S --date "-65 days")
d=$(date +%Y-%m-%dT%H:%M:%S --date "-5 days")
oid=$(mongo --quiet --eval "ObjectId.fromDate(ISODate('$d'))")
cd /data/daily/
rm -r /data/daily/*
TODAY=$(date +"%y-%m-%d")
mkdir "$TODAY"
cd $TODAY
#create subfolders
for HOST in ${BACKUP_HOSTS[@]}
do
mkdir $HOST
done
#extract mongo dumps
echo "$(date '+%Y-%m-%d %H:%M:%S') start retrieving Mongodb backups"
for h in ${BACKUP_HOSTS[@]};do
dbs=`mongo --eval "db.getMongo().getDBNames()" --host $h | grep '"' | tr -d '",' `
for db in $dbs; do
col=`mongo $db --host $h --quiet --eval "db.getCollectionNames()" | tr -d ',"[]' `
for collection in $col; do
xargs -P 0 -n 1 mongodump --host $h -q "{_id:{\$gt:$oid}}" -d $db -c $collection --out /data/daily/$TODAY/$h
done
done
done
但不工作。
也尝试过:
parallel -P 0 -n 1 mongodump --host $h "{_id:{\$gt:$oid}}" -d $db -c $collection --out /data/daily/$TODAY/$h
但我明白了:
bin/bash: -c: line 0: syntax error near unexpected token `('
【问题讨论】:
-
以后调试类似语法错误的一般提示:将
set -x放在脚本顶部附近,您会立即看到额外的(来自哪里。 -
@Jens:一般来说这是个好建议,但在这种情况下无济于事,因为错误消息是由 GNU Parallel 发出的,它调用了
bash在幕后 i>. -
@mklement0 第一个脚本中没有使用 GNU 并行,并且不清楚错误消息不会在两个脚本中出现。我的怀疑是,
$collection有不带引号的括号。 -
@Jens:
$collection的猜测不错,但错误消息中的-c和line 0告诉我们,它不是第一个产生错误的脚本。引发错误的简单方法:parallel echo 'a(' ::: 1。请注意 shell 命令本身在语法上是如何 有效的,但是 Parallel 默认调用它的方式会导致它中断。选项-q解决了这个问题。
标签: bash mongodb parallel-processing xargs gnu-parallel