Вопрос или проблема
Существует много неопределенности относительно способности Планировщика заданий 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: Использование 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 позволит вам легко контролировать выполнение вашего скрипта, минимизируя время простоя и избегая конфликтов.