bash запустить несколько файлов условия выхода - PullRequest
0 голосов
/ 28 июня 2018

У меня есть такая функция

function generic_build_a_module(){

        move_to_the_right_directory
        echo 'copying the common packages'; ./build/build_sdist.sh;
        echo 'installing the api common package'; ./build/cache_deps.sh;
}

Я хочу выйти из функции, если ./build/build_sdist.sh не завершится успешно.

вот содержание ./build/build_sdist.sh

... multiple operations....
echo "installing all pip dependencies from $REQUIREMENTS_FILE_PATH and placing their tar.gz into $PACKAGES_DIR"
pip install --no-use-wheel -d $PACKAGES_DIR -f $PACKAGES_DIR -r $REQUIREMENTS_FILE_PATH $PACKAGES_DIR/*

Другими словами, как основная функция generic_build_a_module «знает», успешно ли завершился ./build/build_sdist.sh?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы можете проверить статус выхода команды, окружив ее if. ! инвертирует статус выхода. Используйте return 1 для выхода из функции со статусом выхода 1.

generic_build_a_module() {
    move_to_the_right_directory
    echo 'copying the common packages'
    if ! ./build/build_sdist.sh; then
        echo "Aborted due to error while executing build."
        return 1
    fi
    echo 'installing the api common package'
    ./build/cache_deps.sh;
}

Если вы не хотите печатать сообщение об ошибке, ту же программу можно написать короче, используя ||.

generic_build_a_module() {
    move_to_the_right_directory
    echo 'copying the common packages'
    ./build/build_sdist.sh || return 1
    echo 'installing the api common package'
    ./build/cache_deps.sh;
}

Кроме того, вы можете использовать set -e. Это приведет к немедленному завершению вашего сценария, когда какая-либо команда завершит работу с ненулевым статусом.

0 голосов
/ 28 июня 2018

Вы можете проверить состояние кода выхода последней выполненной команды, проверив переменную $?. Код выхода 0 является типичным признаком успешного выполнения команды.

Коды выхода можно установить с помощью exit с последующим номером кода в скрипте.

Вот предыдущий вопрос , касающийся использования $? с более подробной информацией, но для простой проверки этого значения попробуйте:

echo "test";echo $?

# Example
echo 'copying the common packages'; ./build/build_sdist.sh;
if [ $? -ne 0 ]; then
    echo "The last command exited with a non-zero code"
fi

[ $? -ne 0 ] Проверяет, не равен ли код ошибки последней выполненной команды 0. Это также полезно, чтобы обеспечить сбор любых отрицательных кодов ошибок, таких как -1.

Предупреждение вышеупомянутого подхода заключается в том, что мы проверили только по последней выполненной команде , а не по ... multiple operations...., которую вы упомянули, поэтому мы могли пропустить ошибку, сгенерированную командой, выполненной до pip install.

В зависимости от ситуации вы можете set -e в последующем сценарии, который инструктирует оболочку для выхода из сценария при первом запуске команды с ненулевым статусом.

Другой вариант - выполнить операцию, аналогичную приведенной в примере ./build/build_sdist.sh, для проверки кода выхода каждой команды. Это даст вам максимальный контроль над тем, когда и как скрипт завершится, и позволит скрипту установить свой собственный код exit.

0 голосов
/ 28 июня 2018

Вы должны сделать следующее: -

  1. Запустите оба сценария в фоновом режиме и сохраните их соответствующий идентификатор процесса в двух переменных

  2. Продолжайте проверять, завершаются ли сценарии или нет после некоторого интервала, скажем, каждые 1-2 секунды.

  3. Убить процесс, который не завершен через определенное время, скажем, 30 секунд

Пример:

  sdist=$(ps -fu $USER|grep -v "grep"|grep "build_sdist.sh"| awk '{print $2}')

OR

 sdist=$(ps -fu $USER|grep [b]uild_sdist.sh| awk '{print $2}')

 deps=$(ps -fu $USER|grep -v "grep"|grep "cache_deps.sh"| awk '{print $2}')

Теперь используйте цикл while для проверки состояния каждые через определенный интервал или просто проверяйте состояние непосредственно через 30 секунд, как показано ниже

  sleep 30 

  if grep "$sdist"; then
     kill -8 $sdist
  fi
  if grep "$deps"; then
     kill -8 $deps
  fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...