Запустите задачу навсегда в Планировщике задач Windows, перезапустите, если не запущена.

Вопрос или проблема

Существует много неопределенности относительно способности Планировщика заданий Windows получать коды возврата от скриптов. Я нашел несколько полезных ответов на Stack Exchange, но ни один из них не совсем соответствует моим потребностям.

Я разрабатываю для Windows 7.

В Планировщике я настроил задачу, которая запускается при входе в систему. Все, что она делает, это вызывает Python-скрипт myscript.py внутри виртуального окружения. Поэтому действие выглядит так:

Программа: PATH\\TO\\pythonw.exe (pythonw, чтобы запускать в скрытом окне)

Аргументы: Path\\TO\\myscript.py

Теперь этот myscript.py является “скриптом, который работает вечно”:

bot = Bot(os.getenv("TOKEN", None))
bot.run()

run() — это, по сути, механизм опроса, который никогда не завершается, пока не произойдет никаких исключений. Вот почему, когда моя задача запускается в Планировщике, она всегда отображается как “выполняется” (является ли это хорошей практикой?)

Это подводит меня к вопросу: как я могу сказать Планировщику заданий перезапустить эту задачу, если она уже существует? По сути, нужно убедиться, что один (и только один) экземпляр этого скрипта работает в любое время, независимо от ситуации.

Если вы не получите ответ о том, как сделать это исключительно с помощью Планировщика заданий Windows, то один из простых способов — использовать AutoHotkey.

Ваш .ahk файл будет выглядеть примерно так, и вы запустите скрипт ahk с вашей запланированной задачей. Обратите внимание, что pythonw.exe может потребовать замены на python.exe или, возможно, py.exe – проверьте диспетчер задач, чтобы увидеть, что это во время выполнения вашего скрипта (я думаю, возможно, pythonw.exe, основываясь на вашем описании). Обратите внимание, что это предполагает, что у вас не будет других скриптов, работающих с использованием pythonw / python. Если вы запустите этот скрипт, он завершит любые другие экземпляры самого себя и pythonw.exe, а затем запустит ваш скрипт. Он также будет работать в цикле, чтобы отслеживать закрытие вашего скрипта и затем снова запустит его.

#SingleInstance force
IfWinExist, ahk_exe pythonw.exe
WinKill, ahk_exe pythonw.exe
Launch:
;возможно, стоит вызвать SetWorkingDir здесь или передать в качестве аргумента в нижеследующую команду
Run, PATH\\TO\\pythonw.exe Path\\TO\\myscript.py
Sleep, 5000
WinWaitClose, ahk_exe pythonw.exe
Sleep, 5000
Goto, Launch

Ответ или решение

Чтобы обеспечить устойчивую работу вашего скрипта myscript.py с помощью Планировщика задач в Windows 7, необходимо учесть несколько важных аспектов. Ваша цель — гарантировать, что только один экземпляр скрипта запускается одновременно, и что задача автоматически перезапускается в случае её завершения.

1. Настройка задачи в Планировщике задач

Первоначально задайте задачу в Планировщике:

  • Триггер: Установите триггер на запуск задачи при входе в систему.

  • Действие: Ваше действие должно запускать Python-скрипт с помощью pythonw.exe, который не открывает консольное окно. Настройка параметров действия будет выглядеть следующим образом:

    • Программа: PATH\TO\pythonw.exe
    • Аргументы: PATH\TO\myscript.py

2. Обработка кода возврата и перезапуск

Одной из ключевых задач является обработка состояния задачи и перезапуск её при необходимости. К сожалению, встроенные возможности Планировщика задач ограничены, и задача не может самостоятельно отслеживать своё состояние. Чтобы решить эту проблему, есть несколько подходов:

Метод 1: Настройка условий перезапуска

  1. В разделе "Условия" настроек задачи установите флажок "Запускать задачу только при подключении к сети". Это может помочь предотвратить случайные отключения задачи.

  2. В разделе "Настройки" убедитесь, что выбраны параметры "Если задача завершена, перезапустить через". Здесь вы можете указать интервал, например 1 минуту.

  3. Также добавьте опцию "Если задача не запущена, повторить через" и укажите время.

В таком случае, Планировщик будет пытаться перезапустить задачу в случае её аварийного завершения.

Метод 2: Использование AutoHotkey

Если вышеперечисленные настройки не обеспечивают должного уровня надёжности, вы можете прибегнуть к использованию AutoHotkey для более тонкой настройки перезапуска. Пример скрипта AutoHotkey, который может отслеживать и перезапускать ваш скрипт Python, может выглядеть следующим образом:

#SingleInstance force
IfWinExist, ahk_exe pythonw.exe
    WinKill, ahk_exe pythonw.exe
Launch:
Run, PATH\TO\pythonw.exe PATH\TO\myscript.py
Sleep, 5000
WinWaitClose, ahk_exe pythonw.exe
Sleep, 5000
Goto, Launch

Этот скрипт:

  • Проверяет, существует ли уже экземпляр вашего скрипта. Если да, он завершает его.
  • Затем запускает новый экземпляр вашего скрипта.
  • Сразу после запуска скрипта, программа будет ожидать его завершения и снова запустит его, если он закроется.

3. Рекомендуемые настройки

При использовании данного подхода с AutoHotkey убедитесь:

  • Правильная версия Python: Проверьте, что вы используете правильную версию Python (python.exe или pythonw.exe), чтобы адекватно обрабатывать фоновый процесс.
  • Отладка и тестирование: Тщательно протестируйте скрипт на случайных ошибках и исключениях, чтобы убедиться, что перезапуск происходит корректно.

Заключение

С помощью описанных методов вы сможете обеспечить постоянное выполнение вашего Python-скрипта в операционной системе Windows 7. Правильно настроенный Планировщик задач в сочетании с AutoHotkey позволит вам легко контролировать выполнение вашего скрипта, минимизируя время простоя и избегая конфликтов.

Оцените материал
Добавить комментарий

Капча загружается...