如何运行具有同时进程的 bash 备份脚本而不陷入无限循环?

如何运行具有同时进程的 bash 备份脚本而不陷入无限循环?

我编写了这个脚本来运行多个架构的 postgresql pg_dump。由于完成所有操作需要花费大量时间,因此我通过以下方式运行同时转储来改进它:

for SCHEMA in $SCH
do
while [ $(jobs | wc -l | xargs) -ge $PROC ]; do  sleep 5; done
/usr/pgsql-$PGVER/bin/pg_dump -h $PGHOST -p $PORT -U postgres -d $DB -n $SCHEMA -Fc -Z 1 2> $LOGDIR/$SCHEMA'-'$DATA'.log' | $ENCCMD $DUMPDIR/$SCHEMA'-'$DATA.bkp.enc $ENCKEY &
done
wait

因此,基本上,这样做的目的是获取正在运行的作业数量,如果大于或等于 5,则等待直到进程数量减少,并保持至少 5 个转储同时运行,直到完成所有模式。

问题是:有时它卡在“while 循环”中,“jobs | wc -l”总是返回数字 5,并且检查 linux 进程没有任何转储正在运行

答案1

两件事情。

  1. 您可能最好使用directory格式pg_dump,该格式并行转储(每个表 1 个线程)。因此类似于pg_dump -d $DB -Fd -j 5 -f $output_directory
  2. 更通用的答案。xargs支持您想要的内容-P
for SCHEMA in $SCH; do
  echo $SCHEMA
done | xargs -L 1 -P 5 bash -c "/usr/pgsql-$PGVER/bin/pg_dump -h $PGHOST -p $PORT -U postgres -d $DB -n "'$0'" -Z 1 | $ENCCMD $DUMPDIR/$SCHEMA'-'$DATA.bkp.enc $ENCKEY"

上面我用来bash包装管道进行加密。xargs将一个参数(-L 1)放在行尾,bash及其代码之后,bash 将其用作,这就是为什么在此示例中$0使用转义的原因 。一次运行 5 个这样的命令,当一个命令结束时,只要其标准输入上有行,它就会启动下一个命令。'xargs

相关内容