Я собираюсь показать вам, как у меня есть сценарий Python, чтобы управлять как услугу на Ubuntu. Я работал над проектом, который является Twitter Bot, которые твиты комплименты на людей Отказ Я написал (слегка разгрузил) пост об этом Немного назад, если вы хотите больше фона. По сути, у меня есть этот бот, работающий в сценарии Python, и я хочу, чтобы этот скрипт Python работает долго. Я определенно хочу выбрать его и выйти из моего сервера! Так что я пошел в поисках некоторых вариантов.
Варианты
Никогда не выходите из сервера. Беги
Python Main.py
и оставить оболочку открытой. Плюсы: очень легко сделать, и я уже знал, как это сделать. Минусы: вероятно, не будет работать долго. Я предполагаю, что SSH-соединения в конце концов. Кроме того, регистрация становится дополнительным шагомPython Main.py |. Tee fanbot.log
или что-то из этого природы. Все вообще, чувствует себя хаке.Nohup
Отказ Сигнал HUP (CUBUP) отправляется на любую задачу, если его управляющий терминал закрыт. Одним из примеров этого является выход из сеанса SSH или закрывает окно открытого терминала. Это заставляет его завернуть и закрыться.Nohup
это команда, которая говорит о работе, чтобы игнорировать сигнал HUP. Я бы мог сделатьNohup Python Main.py &
Отказ & Толкает работу на задний план. Затем работа работает на заднем плане и добавляет все вывод наnohup.out
Отказ Вы можете получить пользовательский логический файл таким же образом:nohup python main.py> custom.log &
Отказ Плюсы: Я могу выйти из системы, я получаю логики, где я хочу их, довольно простая команда. Минусы: умирает, если сервер сбрасывается. Я также не уверен, насколько чисто он может быть убит. По крайней мере, командам пары, чтобы сделать это правильно.Используйте терминальный мультиплексор. Я мог бы использовать что-то вроде
TMUX
бежать в. Для тех из вас, что не знают, чтоTMUX
Это аккуратный способ сохранения и повторного использования оконного окна, панели и истории. Вы можете прикрепить и отсоединить с сеанса TMUX, когда вы хотите, но программы, работающие в сеансе, остаются запущены. Я должен добавитьTMUX
Обзор моему списку вещей, чтобы написать. Плюсы: легко использовать. Работает в основном, как бежать в терминале. Минусы: также умирает, если сервер сбрасывается.TMUX
Чувствуется как немного излишек, просто чтобы управлять этой одной работой. Если вы заинтересованы, вот как это будет снижаться:
$ tmux new -s fanbot_session $ python main.py | tee fanbot.log $d # To detach from tmux # Later, to check on things: $ tmux attach -t fanbot_session
Мы гордимся на обслуживании
Наконец я сдал. Я откладываю это как службу, потому что это звучало сложно и страшно, даже если оно звучало, возможно, это был «правильный» способ делать вещи. Оказывается, это не так уж плохо. Но я слышу, что вы думаете: меньше разговаривают, больше примеров! Позвольте нам сказать, что у нас есть скрипт ниже.
# /home/ryan/bigben.py import time def bong(): print("BONG! It is now {}".format(time.ctime())) if __name__ == "__main__": while True: bong() time.sleep(3600) # Tell the time once an hour
Вроде глупо, но это тип сценария, который вы хотели бы бегать долго, Возможно, автоматически перезапускается и посмотрите журналы позже. OK. Таким образом, нам понадобится только один другой файл: блок службы блока! Создайте файл под названием Bong.Service
Отказ .Service на самом деле не нужен, но я думаю, что приятно иметь.
; /home/ryan/bong.service [Unit] Description=Bong time telling service After=multi-user.target [Service] Type=idle ExecStart=/usr/local/bin/python /home/ryan/bigben.py [Install] WantedBy=multi-user.target
Некоторое объяснение. Единица
Раздел описывает, что такое эта услуга и как это должно быть запущено. После
Переменная сообщает эту услугу, когда разрешено работать. После = multi-user.target
По сути, просто означает, что эта услуга будет в порядке, когда сервер будет готов к входу в систему. Сервис
Раздел десрибает, что Systemd.
(Контроллер услуг) будет делать и как. Тип = холостой
говорит ему только запустить наш сервис, когда не будет работать больше рабочих мест. Execstart
Переменная – это команда, которую мы хотели бы запускать. Обратите внимание, что необходимы абсолютные пути. Наконец, Установить
Раздел позволяет нам иметь наш сервис Auto-Run при загрузке. Женоваство
Переменная говорит, что уже автоматически запущена служба, наш сервис должен начать работу после.
Скопируйте наш сервисный файл в систему сервисной библиотеки, разрешения на настройку, загрузите ее, и позвольте ER RIP!
$ sudo cp bong.service /lib/systemd/system/bong.service $ sudo chmod 644 /lib/systemd/system/bong.service $ sudo systemctl daemon-reload # Refresh the available service list $ sudo systemctl enable bong.service # Now watch your service auto run at bootup $ sudo reboot ... $ sudo systemctl status bong.service # Blah blah blah you should see something happy and green # Want to check your logs? $ sudo journalctl -e -u bong.service # -e scrolls to the end of the logs # -u bong.service filters by the service that we care about # OR: sudo journalctl -f -u bong.service to follow, similar to tail -f
Так что это действительно это! Создайте файл сервиса, покройте его в правильном каталоге и скажите Systemd
об этом. Не так тяжело, как я думал! И вы получаете автоматическое перезапуск, файлы Sane Log, простые проверки состояния. Как видите, это относится не только к Python, но к любому языку, скрипту, программе и т. Д., Что вы можете запустить из командной строки. Это должно работать с рубиновым, Bash, узлом и многое другое!
Бонус: Виртуальные среды
Если вы один из классных детей, вы программируете Python в виртуальной среде. Вы обычно можете сделать что-то вроде следующего, чтобы запустить свой скрипт вручную:
$ python -m venv .venv # Creating a virtual environment in .venv/ $ source .venv/bin/activate (.venv) $ which python /home/ryan/.venv/bin/python (.venv) $ python bigben.py ...
Как, вы спросите меня взволнованно, вы получаете услугу, чтобы бежать в рамках вашей виртуальной среды? Это проще, чем вы можете подумать! Помните эту линию в нашем Bong.Service
файл?
ExecStart=/usr/local/bin/python /home/ryan/bigben.py
Просто укажите путь Python к вашей виртуальной среде. Он автоматически заберет установленные пакеты оттуда.
ExecStart=/home/ryan/.venv/bin/python /home/ryan/bigben.py
Надеюсь, этот пост дает вам полезное Сервис Действительно (Womp Womp Womp)
Первоначально опубликовано мой блог
Оригинал: “https://dev.to/rpalo/script-as-a-service”