Получение кода выхода скрипта Python, запущенного в подоболочке с помощью Bash

Я хочу запускать сценарий 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 при вызове подоболочки (если я правильно прочитал при поиске в 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

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


person Julio María Meca Hansen    schedule 24.04.2020    source источник
comment
stackoverflow.com/questions/11900828/ может помочь.   -  person Lety    schedule 24.04.2020


Ответы (1)


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

person Paul    schedule 24.04.2020