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

스크립트가 실패에 관계없이 모든 명령을 실행하도록 하려면 이 두 -e플래그를 제거하십시오. 반면에 여전히 오류 발생 시 스크립트를 종료하고 싶지만 특정 플래그(귀하의 경우 PostgreSQL)를 포착하고 싶다면 하나의 플래그만 유지하세요. -e어떤 것이 중요하지 않지만 개인적인 선호는 스크립트에 있습니다. shebang에서 오류를 잡는 방법은 ||0이 아닌 것으로 종료되는 명령 끝에 (논리적 OR)을 추가하는 것입니다. 이것이 ||수행하는 작업은 이전 명령의 종료 코드가 0이 아닌 경우 다음 명령을 실행하는 것입니다.

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

위의 예는 psql0이 아닌 종료 코드를 자동으로 포착하고 계속합니다. 명령을 true원하는 대로 바꿀 수 있습니다(오류 기록, 잠시 대기 등...). 0으로 종료되는지 확인하세요. 그렇지 않으면' 같은 방법으로 상황을 끝내겠습니다. 이 true명령은 아무 작업도 수행하지 않으며 코드 0으로 종료됩니다.

관련 정보