В итоге мы остановились на том, что научились запускать скрипт на сервере, чтобы он работал после разрыва соединения . Но это половинчатое решение: если мы перезапустим сервер, то бот остановится. Иногда сервер перезагружается сам на стороне провайдера, например при плановых технических работах. И тогда наши скрипты умирают.
Сейчас нам нужно такое решение, чтобы бот автоматически перезапускался при любых обстоятельствах. Этим и займёмся.
Коротко — суть
Чтобы было понятно, что тут происходит, вот короткая версия:
- Настраиваем удалённый доступ к серверу.
- Создаём папку и заливаем в неё скрипт, который в итоге должен будет работать всё время.
- Создаём у себя на компьютере файл службы — он управляет настройками автозапуска скрипта.
- Отправляем файл службы на сервер.
- Обновляем на сервере данные обо всех службах и запускаем нашу.
Теперь подробно про каждый шаг.
Предварительная работа
Основное, что мы будем использовать, — это удалённый доступ к серверу по SSH. Для этого он должен быть включён на самом сервере, и там же можно сразу посмотреть параметры доступа. Например, для работы нашего учебного сервера мы пользуемся услугами SpaceWeb, где доступ по SSH включается из панели управления:
Пишем Telegram бота на Python + Загружаем Telegram бота на сервер(хостинг)
Как бесконечно запустить функцию в Python?
Как данный код запускать асинхронно до бесконечности, но с контролем количества одновременных выполнений?
Имею ввиду что функция после выполнения — завершается, и сразу вызывается снова эта же функция. Так же идет обработка большого массива данных, и необходимо как то контролировать количество одновременно запущенных функций(например 10). Рекурсия не вариант, т.к. будут утечки памяти. Если функция возвращает False, то количество одновременных выполнений будет уже не 10, а 9, и так пока все функции не завершат правильно работу. Есть ли какой то модуль для такой реализации?
С потоками это достаточно просто — в каждом потоке открывается бесконечный цикл while True и все, но я так понимаю такой подход в асинхронном программирование не верен, как сделать правильно?
Добавлено:
Самое простое, это реализовать вот так:
import asyncio from random import randint async def worker(i): while True: await asyncio.sleep(randint(1,3)) print(f’Worker #’) loop = asyncio.get_event_loop() futures = [loop.create_task(worker(str(i))) for i in range(5)] loop.run_forever()
но я не уверен насколько правильно асинхронную функцию пускать в бесконечный цикл
- Вопрос задан более двух лет назад
- 1530 просмотров
Источник: qna.habr.com
Как постоянно запускать скрипт Python в фоновом режиме в Windows?
Я создал скрипт, который перемещает файлы из одной папки в другую. Но поскольку исходная папка является папкой «Загрузки», мне нужно, чтобы она всегда работала в фоновом режиме.
Создаем TELEGRAM бота на PYTHON и заливаем на БЕСПЛАТНЫЙ ХОСТИНГ за 5 МИНУТ
У меня также есть стандартный пакетный файл, который выглядит примерно так:
Я использую Windows 10 . Я нашел информацию для Linux и OS о том, как использовать nohup в командном файле. Есть ли версия для Windows?
Если есть, нужно ли выполнять скрипт каждый раз при перезагрузке или включении ПК?
Кроме того, как вы прекращаете процесс, когда вам удается сделать его постоянным?
Thanos Dodd 1 Дек 2019 в 15:29
3 ответа
Лучший ответ
В Windows вы можете использовать pythonw.exe по порядку для запуска скрипта Python в качестве фонового процесса:
Скрипты Python (файлы с расширением .py ) будут выполняться python.exe по умолчанию. Этот исполняемый файл открывает терминал, который остается открывать, даже если программа использует графический интерфейс. Если вы не хотите случится, используйте расширение .pyw , которое заставит скрипт быть выполняется pythonw.exe по умолчанию (оба исполняемых файла находятся в верхний уровень каталога установки Python). Это подавляет окно терминала при запуске.
C:ThanosDoddPython3.6pythonw.exe C:\PythonScriptsmoveDLs.py
Чтобы ваш скрипт работал непрерывно, вы можете использовать sched для планирования мероприятий:
Модуль sched определяет класс, который реализует планировщик событий общего назначения.
import sched import time event_schedule = sched.scheduler(time.time, time.sleep) def do_something(): print(«Hello, World!») event_schedule.enter(30, 1, do_something, (sc,)) event_schedule.enter(30, 1, do_something, (s,)) event_schedule.run()
Теперь, чтобы убить фоновый процесс в Windows, вам нужно просто запустить:
taskkill /pid processId /f
Где processId — это идентификатор процесса, который вы хотите убить.
Giorgos Myrianthous 19 Сен 2020 в 00:05
Я нашел решение, которое работает:
import shutil, os, time while True: for filename in os.listdir(‘folderToMoveFrom’): if filename.endswith((desired file extensions)): shutil.move( (folderToMoveFrom + filename), folderToMoveTo) time.sleep(6)
Если вы выполнили приведенный выше код без функции time.sleep (), программа вылетает после того, как новый файл входит в папку из-за ошибки «файл не найден», вложенной в другую ошибку «файл не найден».
Не уверен, о чем идет речь, но я доволен тем, что у меня есть до сих пор. Единственное, что вам нужно сделать сейчас, это добавить скрипт в планировщик задач для запуска под Pythonw, чтобы он работал как фоновый процесс. Или вместо запуска сценария вы можете запустить командный файл, если не забываете добавить соответствующую инструкцию для pythonw. Вы должны начать процесс только один раз, конечно.
Thanos Dodd 4 Дек 2019 в 16:36
Одним из вариантов является изменение вашего сценария, чтобы он работал непрерывно, а не многократно. Просто оберните все это во время цикла и добавьте сон.
import time while True: your_script_here time.sleep(300)
Источник: question-it.com