Bash 脚本中止 for 循环

Bash 脚本中止 for 循环

我有以下脚本:

#!/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

如果您希望脚本执行所有命令而不考虑任何失败,请删除这两个-e标志。另一方面,如果您仍然想在出现错误时终止脚本,但想捕获特定的一个(在您的情况下是 PostgreSQL),则只保留一个标志-e,哪个标志并不重要,但个人喜好是在脚本上而不是在 shebang 上,捕获错误的方法是在||以非 0 退出的命令末尾添加一个(逻辑或)。这样||做的作用是,如果上一个命令退出代码不为 0,则执行以下命令一:

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

上面的示例将默默地捕获psql非 0 退出代码并继续,您可以将命令替换true为您喜欢的任何内容(记录错误,等待一段时间等...)只需确保它以 0 退出,否则您将以相同的方式结束情况。该true命令根本不执行任何操作,只是以 0 代码退出。

相关内容