Скрипт Bash с несколькими командами papermill не дает сбоя при ошибках ноутбука - PullRequest
1 голос
/ 02 апреля 2019

У меня есть файл refresh_data.sh, который содержит несколько команд бумажной фабрики, например:

papermill notebook_1.ipynb output_1.ipynb -p start "2017-12-01" -p date "2017-12-31"
papermill notebook_2.ipynb output_2.ipynb -p start "2018-01-01" -p date "2018-01-31"

Если я получаю сообщение об ошибке во время работы первого ноутбука, процесс продолжит выполнение второго.

Другими словами, ошибка в одном из ноутбуков не «ломает» весь сценарий.

Насколько я помню, с обычными скриптами на python, если в одной из команд в скрипте bash есть ошибка, это прерывает выполнение всего скрипта.

Каково стандартное поведение bash-скрипта в этом случае? Могу ли я изменить его, чтобы он останавливался, как только произошла ошибка?

1 Ответ

2 голосов
/ 04 апреля 2019

Если ваш bash-скрипт настроен на: set -e, он потерпит неудачу, если команда выдаст ошибку:

Автоматический выход из сценария оболочки bash при ошибке

#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately

Вы можете запустить бумажную фабрику, используя:

--log-output для получения дополнительной информации о том, почему ваш ноутбук вышел из строя.

papermill "${INPUT_NOTEBOOK_PATH}" "${OUTPUT_NOTEBOOK_PATH}" --log-output

Для захвата результата выполнения записной книжки вы всегда можете захватить результат любой предыдущей команды, используя $?:

  papermill "${INPUT_NOTEBOOK_PATH}" "${OUTPUT_NOTEBOOK_PATH}" --log-output
  notebook_result=$?
  if [[ ${notebook_result} -eq 0 ]]; then
    echo "All good"
  else
    echo $notebook_result
  fi
...