AWS s3 syn c продолжает сбой в ловушке SIGTERM - PullRequest
0 голосов
/ 17 января 2020

Я запускаю свой скрипт с командой 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, даже если я установил ловушку для обработки этого сигнала в моем сценарии.

...