Я запускаю свой скрипт с командой timeout, которая отправляет SIGTERM после достижения лимита времени ожидания. Это для тестирования, когда запускается команда s3 syn c, отсюда время ожидания 30 с.
Моя цель - чтобы команда aws s3 syn c изящно завершилась sh текущая загрузка, и только после этого скрипт должен завершить работу и выполнить любые функции после прерывания, такие как электронная почта и очистка.
0 0 * * * root timeout 30s /etc/archive/archive.sh"
В моем сценарии установлены следующие флаги:
set -o nounset -o errtrace -o xtrace
И следующие ловушки:
trap 'failure ${LINENO} "$BASH_COMMAND"' ERR
trap 'terminated' SIGTERM
trap 'user_interrupt' SIGINT
trap 'email_report && s3_upload_catalog && cleanup_all' EXIT
Вот мои функции:
# Called when script errors out
function failure {
local lineno=$1
local msg=$2
report+="Failed at $lineno: $msg\n"
status="failed"
exit 1
}
# Called when script is sent SIGTERM, likely from timeout command
function terminated {
report+="Got SIGTERM, see timeout command in /etc/cron.d/archive_audio\n"
status="successful"
timeout_triggered=true
}
# Called when script errors
function user_interrupt {
report+="Got SIGINT, user terminated script\n"
status="failed"
exit 1
}
Мой скрипт вызовет ловушку для SIGTERM, таймаут которого отправляется через 30 секунд, пока aws s3 В моем скрипте запущена команда syn c (правильно!) Но сразу же это вызовет ловушку ERR. Это как если бы SIGTERM всегда прерывал и завершал команду aws s3 syn c с ошибкой. Я хочу, чтобы мой скрипт перехватил SIGTERM и завершил sh команду s3.
I wi sh мой скрипт может просто перехватить SIGTERM, вызвать функцию, чтобы установить переменную, которая была отправлена SIGTERM, и позволить мне завершить sh мой текущий l oop:
for folder in $archive_folders; do
... some stuff ...
s3_upload_archive
if [ "$timeout_triggered" = true ]; then
exit 0
fi
done
Но нет, команда aws s3 НЕ ВЫПОЛНЯЕТСЯ сразу после sigterm, и мои сценарии завершаются, потому что она вызывает ловушку ERR.
Пока я ввел обходной путь, это уродливо (|| [ "$timeout_triggered" = true ]
:
# Upload to AWS bucket
function s3_upload_archive {
source="$work_dir/"
target="s3://$bucket/$prefix/$host/"
aws s3 sync $source $target --storage-class "$storage_class" \
|| [ "$timeout_triggered" = true ]
}
Я пытался включить aws s3 syn c .. & в фоновый процесс и ждать, но это не работает, результаты те же:
aws s3 sync $source $target --storage-class "$storage_class" &
wait
I У меня нет идей, это не имеет смысла, почему aws s3 syn c продолжает выходить с ошибкой каждый раз, когда получает SIGTERM, даже если я установил ловушку для обработки этого сигнала в моем сценарии.