Рубрики
Без рубрики

Сценарий как услуга

Как я получил настройку длинногущенного Python Script в качестве службы с регистрацией, автоматически перезапуском и простым состоянием проверки без боли!. Теги с Python, Sysadmin, Linux.

Я собираюсь показать вам, как у меня есть сценарий Python, чтобы управлять как услугу на Ubuntu. Я работал над проектом, который является Twitter Bot, которые твиты комплименты на людей Отказ Я написал (слегка разгрузил) пост об этом Немного назад, если вы хотите больше фона. По сути, у меня есть этот бот, работающий в сценарии Python, и я хочу, чтобы этот скрипт Python работает долго. Я определенно хочу выбрать его и выйти из моего сервера! Так что я пошел в поисках некоторых вариантов.

Варианты

  1. Никогда не выходите из сервера. Беги Python Main.py и оставить оболочку открытой. Плюсы: очень легко сделать, и я уже знал, как это сделать. Минусы: вероятно, не будет работать долго. Я предполагаю, что SSH-соединения в конце концов. Кроме того, регистрация становится дополнительным шагом Python Main.py |. Tee fanbot.log или что-то из этого природы. Все вообще, чувствует себя хаке.

  2. Nohup Отказ Сигнал HUP (CUBUP) отправляется на любую задачу, если его управляющий терминал закрыт. Одним из примеров этого является выход из сеанса SSH или закрывает окно открытого терминала. Это заставляет его завернуть и закрыться. Nohup это команда, которая говорит о работе, чтобы игнорировать сигнал HUP. Я бы мог сделать Nohup Python Main.py & Отказ & Толкает работу на задний план. Затем работа работает на заднем плане и добавляет все вывод на nohup.out Отказ Вы можете получить пользовательский логический файл таким же образом: nohup python main.py> custom.log & Отказ Плюсы: Я могу выйти из системы, я получаю логики, где я хочу их, довольно простая команда. Минусы: умирает, если сервер сбрасывается. Я также не уверен, насколько чисто он может быть убит. По крайней мере, командам пары, чтобы сделать это правильно.

  3. Используйте терминальный мультиплексор. Я мог бы использовать что-то вроде 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”