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