Получение кода завершения скрипта Python, запущенного в подоболочке с Bash - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу запускать сценарий Bash каждую минуту (через запись CRON), чтобы запускать серию Python сценариев детально (по времени).

Пока что это скрипт, который я сделал:

# set the current date
DATE=`date +%Y-%m-%d`

# set the current system time (HH:MM)
SYSTIME=`date +%H-%M`

# parse all .py script files in the 'daily' folder
for f in daily/*.py; do
    if [[ -f $f ]]; then
        # set the script name
        SCRIPT=$(basename $f)

        # get the script time
        SCRTIME=`echo $SCRIPT | cut -c1-5`

        # execute the script only if its intended execution time and the system time match
        if [[ $SCRTIME == $SYSTIME ]]; then
            # ensure the directory exists
            install -v -m755 -d done/$DATE/failed

            # execute the script
            python3 evaluator.py $f > done/$DATE/daily-$SCRIPT.log &

            # evaluate the result
            if [ $? -eq 0 ]; then
                # move the script to the 'done' folder
                cp $f done/$DATE/daily-$SCRIPT
            else
                # log the failure
                mv done/$DATE/daily-$SCRIPT.log done/$DATE/failed/

                # move the script to the 'retry' folder for retrial
                cp $f retry/daily-$SCRIPT
            fi
        fi
    fi
done

Допустим, у нас есть следующие файлы в папке с именем daily/ (для ежедневного выполнения):

daily/08-00-script-1.py
daily/08-00-script-2.py
daily/08-05-script-3.py
daily/09-20-script-4.py

Идея для гранулированного выполнения в том, что задача CRON запускает этот скрипт каждую минуту. Я получаю системное время и извлекаю время выполнения для каждого сценария, и когда время между системой и файлом сценария совпадает, оно передается Python. Пока все хорошо.

Я знаю, что этот скрипт не прав в том смысле, что он получает подоболочку для каждого сценария, который будет выполняться, но следующий код неверен, так как я знаю, Bash автоматически возвращает 0 при вызове subshell (если я правильно прочитал при поиске в Google) и что мне нужно, чтобы каждая подоболочка выполняла приведенный ниже код, поэтому в случае сбоя она отправляется в другую папку (retry/), которая контролируется другой Bash запуск сценария проверяет каждые 30 минут на повторную попытку (это тот же сценарий, что и этот, за исключением проверки).

Итак, в основном мне нужно выполнить следующее:

# evaluate the result
if [ $? -eq 0 ]; then
    # move the script to the 'done' folder
    cp $f done/$DATE/daily-$SCRIPT
else
    # log the failure
    mv done/$DATE/daily-$SCRIPT.log done/$DATE/failed/

    # move the script to the 'retry' folder for retrial
    cp $f retry/daily-$SCRIPT
fi

Для каждое неубедительное исполнение. Как я могу сделать это правильно?

1 Ответ

1 голос
/ 24 апреля 2020

Bash может возвращать 0 для каждого вызова под-оболочки, но если вы дождетесь результата, вы получите результат (и я не вижу амперсанда). Если команды python3 передают код завершения скрипта, тогда ваш код будет работать. Если ваш код не улавливает ошибку, то это ошибка python3, и вам нужно создать сообщение об ошибке. Перенаправление вывода stderr может быть полезным, но сначала убедитесь, что ваш код не работает.

...