Linux
如何在不陷入無限循環的情況下同時執行 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 程序沒有執行任何轉儲
兩件事情。
- 您可能最好使用
directory
格式 inpg_dump
,它並行轉儲(每個表 1 個執行緒)。所以像pg_dump -d $DB -Fd -j 5 -f $output_directory
.- 更通用的答案。
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