for ループを中断する Bash スクリプト

for ループを中断する Bash スクリプト

次のスクリプトがあります。

#!/bin/bash -e
set -e
DATA_DIR=/home/admin/backup_avl_historico/data
DB_HOST=myHost
DB_USER=myPass

#extract table list
logger 'Extracting Table List'
psql -h $DB_HOST -U $DB_USER -c "select table_name from information_schema.tables where table_name like 'avl_historico_%';" -t -o $DATA_DIR/tables.list
array=($(wc -l $DATA_DIR/tables.list))
logger ''$array
total_tables=${array[0]}
logger 'Total tables: '$total_tables

#Get max date
max_date=$(psql -h $DB_HOST -U $DB_USER -t -c "select now() - interval '12 months'")
logger 'Max date: '$max_date

array=($max_date)
date=${array[0]}
logger 'Only date: '$date

#Dump each table
while read table_name
do
logger 'looping...'
        if [ ! -z "$table_name" ]; then
                logger 'Processing table '$table_name
                output=${table_name}_pre_${date}.csv
                psql -h $DB_HOST -U $DB_USER -t -F , -c "COPY (select * from reports.$table_name where fecha < '$max_date') TO STDOUT WITH CSV" -o ${DATA_DIR}/$output
                if [ -f ${DATA_DIR}/$output ];then
                        if test -s ${DATA_DIR}/$output
                        then
                                logger 'Deleting records'
                                psql -h $DB_HOST -U $DB_USER -c "delete from reports.$table_name where fecha < '$max_date'"
                                logger 'Gzipping '$output
                                pigz  ${DATA_DIR}/$output
                                logger 'Moving to S3'
                                aws s3 mv ${DATA_DIR}/$output.gz s3://my-bucket/avl_historico/
                                logger 'Vacuuming table'
                                psql -h $DB_HOST -U $DB_USER -c "vacuum full analyze reports.$table_name"
                        else
                                rm ${DATA_DIR}/$output
                        fi
                fi
        fi
done < $DATA_DIR/tables.list

私が経験している問題は、PostgreSQLがステートメントを終了すると次のエラーが発生することです。

ERROR:  canceling statement due to lock timeout

スクリプト全体が中断され、次のループのdo繰り返しは続行されません。

終了条件を避ける方法のアイデアは大変感謝します。したがって、スクリプトは1回の反復をスキップし、残りは続行できます。

ベストアンサー1

スクリプトに失敗に関係なくすべてのコマンドを実行させるには、これら2つの-eフラグを削除します。一方、まだエラーが発生したときにスクリプトを終了したいのですが、特定のフラグ(あなたの場合はPostgreSQL)をキャッチしたい場合は、1つのフラグだけを保持してください。-e何も問題ではありませんが、個人的な好みはスクリプトにあります。 shebangでエラーをキャッチする方法は、||ゼロ以外で終了するコマンドの最後に(論理OR)を追加することです。これ||が行うことは、前のコマンドの終了コードがゼロでない場合は、次のコマンドを実行することです。

psql -h $DB_HOST -U $DB_USER -c "delete from reports.$table_name where fecha < '$max_date'" || true

上記の例では、psqlゼロ以外の終了コードを自動的にキャプチャして続行します。コマンドをtrue好きなように変更できます(エラー履歴、しばらく待機など...)。 0で終了することを確認してください。それ以外の場合は、同じ方法で状況を終了します。このtrueコマンドは何も実行せず、コード 0 で終了します。

おすすめ記事