Расписание Python Script в Bash? - PullRequest
2 голосов
/ 20 октября 2019

Я новичок в планировании сценариев Python и мне нужно запустить сценарий, чтобы он мог работать в течение дня или двух. Мне не разрешено использовать cron в моей среде, поэтому я использую этот скрипт bash. Какой простой тест я могу сделать, чтобы убедиться, что файл python работает? Откуда мне знать, что мой файл работал? А также, если выдается ошибка, как я могу убедиться, что меня уведомили? Любая помощь будет оценена.

#!/usr/bin/bash

while true
do
    DATE="$(date +'%d')"
    MONTH="$(date +'%m')"
    YEAR="$(date +'%Y')"
    HOUR="$(date +'%H')"
    MINUTE="$(date +'%M')"
    if ([ "$DATE" = "27" ]) && [ "$HOUR" = "12" ] && [ "$MINUTE" = "30" ]
    then
                 /my_file.py
        sleep 24h
    fi
done

1 Ответ

1 голос
/ 20 октября 2019

Я добавил небольшой фрагмент.

С помощью переменной TRIGGER вы можете выбрать дату, когда скрипт (cron.sh или в вашем случае курс cron.py) должен быть запущен в первый раз.

WAIT определяетпромежуток между запуском скрипта (cron) и следующим запуском (например, 5 минут или 24 часа ). В моем примере я просто жду 5 минут до следующегоrun.

Затем мы проверяем, существует ли идентификатор процесса запущенного скрипта cron.sh и реагируем на это:

  • PID недоступен и возвращаемое значение не равно нулю: нам нужноперезапустите скрипт. Произошла ошибка.
  • PID недоступен, а возвращаемое значение равно нулю: увеличить значение триггера (время ожидания). Нет ошибок.

Обратите внимание, что это только подход, очень быстрый и грязный. Это должно только продемонстрировать, как это можно сделать. Вы можете воспользоваться этим и реализовать свои собственные функции сейчас (уведомления, ведение журнала и т. Д.)

Дополнительно:

  • Вы можете проверить, как часто выполнялся cron-скриптначалось. Например, установите предел для перезапуска cron. Если cron-скрипт дает сбой несколько раз подряд, вы должны деактивировать это и уведомить об этом пользователя.

  • Если вы хотите получать уведомления в случае сбоя вашего скрипта несколько раз, я личнонапример, опция отправки почты: Отправить почту через терминал

  • Работая с массивами и циклами, можно отслеживать более одного Python- или bash-скрипта.

#!/usr/bin/bash

# Select how long between each run should be waited
WAIT="5 minutes"


process_started=false
tmp_pid=0

# For starting a detached process
startProcess() { 
    ./cron.sh &>/dev/null &
    tmp_pid=$(echo $!)
    process_started=true;
    return 0
}


# Make the current date to the staring point
TRIGGER=$(date +'%d-%m-%y-%H-%M') 
echo "Starting Point: $TRIGGER"

while true
do
  # Check for the trigger
  if [ $(date +'%d-%m-%y-%H-%M') = "$TRIGGER" ]; then
    # No process has been stared. Start the proces now
    if [ "$process_started" = false ]; then
      startProcess
      echo "Started script: "  $(date +'%d-%m-%y %H:%M:%S') " (PID $tmp_pid)"
    fi

    # Check for existence
    if ! kill -0 $tmp_pid > /dev/null 2>&1; then
      echo "No process found with pid $tmp_pid" >&2
      # Now, no process has been found. 
      # We can check of the exit code to determine
      # if the process has exited normally
      wait ${tmp_pid}
      if [ $? -eq 0 ]; then
       echo "Script exited normal: " $(date +'%d-%m-%y %H:%M:%S')" . Waiting another $WAIT"
        # Process has been exited normally.
        # Resetting the trigger.
        TRIGGER=$(date +'%d-%m-%y-%H-%M' -d "$WAIT")
        echo "New run in $WAIT: $TRIGGER"
      else
        echo "Script exited with an error"
        # Here. e. g. Start the script again
        startProcess
        echo "Retarted script: "  $(date +'%d-%m-%y %H:%M:%S') " (PID $tmp_pid)"
      fi
    fi
    sleep 1s
  fi
done

Это, конечно, также работает со скриптом Python. Просто измените функцию startProcess:

startProcess() { 
    ./cron.py &>/dev/null &
    tmp_pid=$(echo $!)
    process_started=true;
    return 0
}

и не забудьте включить #!/usr/bin/env python3 в ваш файл cron.py.


со следующим cron.sh

x=1
while [ $x -le 5 ]
do
  x=$(( $x + 1 ))
  sleep 1s
done
exit 0

вы получите вывод:

Starting Point: 20-10-19-05-22
Started script:  20-10-19 05:22:36  (PID 86402)
No process found with pid 86402
Script exited normal:  20-10-19 05:22:46. Waiting another 5 minutes
New run in 5 minutes: 20-10-19-05-27
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...