Bash-Skript bricht for-Schleife ab

Bash-Skript bricht for-Schleife ab

Ich habe folgendes Skript:

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

Mein Problem besteht darin, dass beim Beenden einer Anweisung durch PostgreSQL der folgende Fehler auftritt:

ERROR:  canceling statement due to lock timeout

Das gesamte Skript wird abgebrochen und nicht mit der nächsten Iteration der doSchleife fortgesetzt.

Ich bin für alle Ideen dankbar, wie man diese Beendigungsbedingung vermeiden kann, sodass das Skript nur eine Iteration überspringen und mit dem Rest fortfahren kann.

Antwort1

Wenn Sie möchten, dass Ihr Skript alle Befehle ausführt und dabei Fehler ignoriert, entfernen Sie beide -eFlags. Wenn Sie andererseits das Skript im Fehlerfall trotzdem beenden möchten, aber einen bestimmten Fehler abfangen möchten (in Ihrem Fall PostgreSQL), lassen Sie nur eines der Flags stehen. -eEs ist egal, welches, aber eine persönliche Präferenz liegt beim Skript, nicht beim Shebang, und die Möglichkeit, den Fehler abzufangen, besteht darin, ||am Ende des Befehls ein (logisches ODER) hinzuzufügen, das mit einem Wert ungleich 0 beendet wird. ||Wenn der Exit-Code des vorherigen Befehls ungleich 0 ist, führen Sie das Folgende aus:

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

Das obige Beispiel fängt psqlExit-Codes ungleich 0 stillschweigend ab und fährt fort. Sie können den trueBefehl beliebig ersetzen (den Fehler protokollieren, eine Weile warten usw.). Stellen Sie nur sicher, dass er mit 0 beendet wird, sonst enden Sie in derselben Situation. Der trueBefehl tut absolut gar nichts, er wird nur mit dem Code 0 beendet.

verwandte Informationen