Я написал скрипт Python, который проверяет определенный адрес электронной почты и передает новые сообщения во внешнюю программу. Как я могу заставить этот скрипт выполняться 24/7, например, превратив его в демон или службу в Linux. Нужен ли мне цикл, который никогда не заканчивается в программе, или это можно сделать, просто повторяя код несколько раз?
175
systemd
вы можете создать сервис systemd вdaemon
режиме, как описано здесь . См. Также: freedesktop.org/software/systemd/man/systemd.service.htmlОтветы:
У вас есть два варианта здесь.
Сделайте правильную работу cron, которая вызывает ваш скрипт. Cron - это общее имя для демона GNU / Linux, который периодически запускает скрипты в соответствии с заданным вами расписанием. Вы добавляете свой скрипт в crontab или помещаете символическую ссылку на него в специальный каталог, и демон выполняет его запуск в фоновом режиме. Вы можете прочитать больше в Википедии. Существует множество различных демонов cron, но в вашей системе GNU / Linux она должна быть уже установлена.
Используйте некоторый подход к Python (например, библиотеку), чтобы ваш сценарий мог демонизировать себя. Да, это потребует простой петли событий (где ваши события запускаются по таймеру, возможно, обеспечивается функцией сна).
Я бы не рекомендовал вам выбирать 2., потому что вы на самом деле повторяли бы функциональность cron. Системная парадигма Linux - позволить нескольким простым инструментам взаимодействовать и решать ваши проблемы. Если нет дополнительных причин, по которым вы должны создать демон (в дополнение к периодическому запуску), выберите другой подход.
Также, если вы используете daemonize с циклом и происходит сбой, никто не будет проверять почту после этого (как указал Иван Невоструев в комментариях к этому ответу). Хотя, если скрипт добавлен как задание cron, он просто сработает снова.
источник
crontab
списке? Если я настрою такое.py
на почасовую работу, создаст ли оно много процессов, которые никогда не будут прекращены? Если это так, я думаю, что это очень похоже на демона.Вот хороший класс, который взят отсюда :
источник
Вы должны использовать библиотеку python-daemon , она обо всем позаботится.
Из PyPI: библиотека для реализации хорошо работающего процесса демона Unix.
источник
Вы можете использовать fork () для отсоединения вашего скрипта от tty и продолжения его работы, вот так:
Конечно, вам также нужно реализовать бесконечный цикл, как
Надеюсь, ты начал.
источник
nohup
/disown
могут отделить процесс от консоли, и он не умрет. Или вы можете начать его сВы также можете запустить скрипт Python как сервис, используя скрипт оболочки. Сначала создайте сценарий оболочки для запуска сценария Python, как этот (имя сценария произвольное имя)
теперь создайте файл в /etc/init.d/scriptname
Теперь вы можете запускать и останавливать ваш скрипт на python, используя команду /etc/init.d/scriptname start или stop.
источник
Простая и поддерживаются версией является
Daemonize
.Установите его из Python Package Index (PyPI):
а затем использовать как:
источник
cron
явно отличный выбор для многих целей. Однако он не создает службу или демон, как вы запросили в OP.cron
просто запускает задания периодически (то есть задание запускается и останавливается), и не чаще, чем раз в минуту. Есть проблемы сcron
- например, если предыдущий экземпляр вашего скрипта все еще работает в следующий раз, когдаcron
расписание приходит и запускает новый экземпляр, это нормально?cron
не обрабатывает зависимости; он просто пытается начать работу, когда расписание говорит.Если вы обнаружите ситуацию, когда вам действительно нужен демон (процесс, который никогда не останавливается), взгляните на него
supervisord
. Он предоставляет простой способ обернуть обычный, недемонизированный скрипт или программу и заставить его работать как демон. Это гораздо лучший способ, чем создание нативного демона Python.источник
как насчет использования
$nohup
команды в Linux?Я использую его для запуска своих команд на моем сервере Bluehost.
Пожалуйста, совет, если я ошибаюсь.
источник
Если вы используете терминал (ssh или что-то еще) и хотите, чтобы после выхода из терминала долгое время работал скрипт, вы можете попробовать это:
screen
apt-get install screen
создать виртуальный терминал внутри (а именно abc):
screen -dmS abc
Теперь мы подключаемся к ABC:
screen -r abc
Итак, теперь мы можем запустить скрипт Python:
python keep_sending_mails.py
отныне вы можете напрямую закрыть свой терминал, однако скрипт python будет продолжать работать, а не выключаться
Если вы хотите вернуться и проверить состояние запущенного скрипта, вы можете использовать
screen -r abc
сноваисточник
Сначала прочтите почтовые псевдонимы. Почтовый псевдоним будет делать это внутри почтовой системы без необходимости дурачиться с демонами или сервисами или чем-то в этом роде.
Вы можете написать простой скрипт, который будет выполняться sendmail каждый раз, когда почтовое сообщение отправляется на определенный почтовый ящик.
См. Http://www.feep.net/sendmail/tutorial/intro/aliases.html.
Если вы действительно хотите написать ненужно сложный сервер, вы можете сделать это.
Это все, что нужно. Ваш сценарий просто зацикливается и спит.
источник
do_the_work()
что сценарий может разбиться, и никто не сможет его запуститьtry
сбойexcept:
части, и вместо этого будет вызвана часть (в данном случае ничего), но цикл продолжится и будет пытаться вызвать функцию.Предполагая, что вы действительно хотите, чтобы ваш цикл работал 24/7 в качестве фоновой службы
Для решения, которое не включает внедрение кода в библиотеки, вы можете просто создать шаблон службы, поскольку вы используете Linux:
Поместите этот файл в папку службы демона (обычно
/etc/systemd/system/
) и установите его с помощью следующих команд systemctl (вероятно, потребуются права sudo):Затем вы можете проверить, работает ли ваш сервис, с помощью команды:
источник
Я бы порекомендовал это решение. Вам нужно наследовать и переопределять метод
run
.источник
чтобы создать какую-то вещь, которая работает как сервис, вы можете использовать эту вещь:
Первое, что вы должны сделать, это установить инфраструктуру Cement : работа с цементом - это работа с CLI, в которой вы можете развернуть на ней свое приложение.
интерфейс командной строки приложения:
interface.py
Класс YourApp.py:
Имейте в виду, что ваше приложение должно работать в потоке, чтобы быть демоном
Чтобы запустить приложение, просто сделайте это в командной строке
источник
Используйте любой сервисный менеджер, который предлагает ваша система - например, в Ubuntu используйте upstart . Это будет обрабатывать все детали для вас, такие как запуск при загрузке, перезапуск при сбое и т. Д.
источник