Intereting Posts
Не удается установить новое ядро ​​на сервере ubuntu. «Ошибка gzip: stdout: Отсутствие пробела на устройстве», несмотря на обилие дискового пространства Запуск Arch Linux при загрузке в защитную оболочку по умолчанию ddwrt to openwrt; блокировка имени хоста или домена на основе адреса mac Как запустить ipsec на Gentoo после переноса на systemd? xkb config имеет бессмысленный вход? Вставить результат команды в исполняемый файл (одна команда) Почему inotify события различны для монтирования NFS? Восстановление команды Rm для этой ситуации «Протокол не указан» при запуске vim с sudo Все линии не перемещаются по трубе? Прокси все запросы: Linux Проверьте, подключены ли клавиатура и мышь Есть ли более новая версия gcc в красной шляпе? Неверная иконка Opera в Gnome Shell Показывать текстовый файл по одной странице за один раз, подождать 20 секунд, затем автоматически настроить

Прерывание цикла 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 

Весь скрипт прерывается и не продолжит следующую итерацию цикла.

Любые идеи о том, как избежать этого условия выхода, будут оценены, поэтому сценарий может просто пропустить одну итерацию, но продолжить с остальными

Если вы хотите, чтобы ваш скрипт выполнял все команды, не обращая внимания на какой-либо сбой, удалите оба -e . С другой стороны, если вы все еще хотите завершить скрипт в случае ошибки, но хотите поймать конкретный (PostgreSQL в вашем случае), оставите только один из флагов -e , неважно, какой из них, кроме личного предпочтение отдается скрипту не на shebang, а способ поймать ошибку – добавить || (логическое ИЛИ) до конца команды, выходящей с не 0. Что это || do, если предыдущий код выхода команды не равен 0, выполните следующее:

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

В приведенном выше примере будет тихо выходить из кодов выхода без использования кода psql без продолжения, вы можете заменить true команду на все, что вам нравится (зарегистрировать ошибку, подождать некоторое время и т. Д.), Просто убедитесь, что она завершена с 0, или вы закончите в той же ситуации. true команда абсолютно ничего не делает, она просто выходит с кодом 0.