Я хочу запускать сценарий 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
Для каждого выполнения в подоболочке. Как я могу сделать это правильно?