Linux

如何在不陷入無限循環的情況下同時執行 bash 備份腳本?

  • October 2, 2020

我為執行多個模式的 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. 您可能最好使用directory格式 in 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將一個 arg (-L 1) 放在行尾,afterbash和它的程式碼,bash 使用它 as ,這就是在這個例子中$0它被轉義的原因 。一次執行 5 個這樣的命令,當一個命令結束時,只要它的標準輸入上有行,它就會開始下一個命令。'``xargs

引用自:https://serverfault.com/questions/1036002