Create python service linux

Запускаем Python-скрипт на сервере, чтобы он работал всё время

В итоге мы остановились на том, что научились запускать скрипт на сервере, чтобы он работал после разрыва соединения. Но это половинчатое решение: если мы перезапустим сервер, то бот остановится. Иногда сервер перезагружается сам на стороне провайдера, например при плановых технических работах. И тогда наши скрипты умирают.

Сейчас нам нужно такое решение, чтобы бот автоматически перезапускался при любых обстоятельствах. Этим и займёмся.

Коротко — суть

Чтобы было понятно, что тут происходит, вот короткая версия:

  1. Настраиваем удалённый доступ к серверу.
  2. Создаём папку и заливаем в неё скрипт, который в итоге должен будет работать всё время.
  3. Создаём у себя на компьютере файл службы — он управляет настройками автозапуска скрипта.
  4. Отправляем файл службы на сервер.
  5. Обновляем на сервере данные обо всех службах и запускаем нашу.

Теперь подробно про каждый шаг.

Предварительная работа

Основное, что мы будем использовать, — это удалённый доступ к серверу по SSH. Для этого он должен быть включён на самом сервере, и там же можно сразу посмотреть параметры доступа. Например, для работы нашего учебного сервера мы пользуемся услугами SpaceWeb, где доступ по SSH включается из панели управления:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Запускаем SSH и проверяем, что соединение устанавливается. Чтобы соединиться, нужно написать в терминале команду ssh имя_пользователя@адрес_сервера, после чего нажать Enter. Сервер спросит пароль, и, если мы его правильно ввели, нас пустят.

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Мы видим приветствие сервера, значит, всё прошло хорошо и мы можем управлять им со своего компьютера. Для этого нужно будет писать в терминал команды и реагировать на то, что тебе ответит сервер.

Отправляем скрипт на сервер

Чтобы не захламлять корневую папку на сервере, создадим новую папку bot. Вот эта команда:

После этого открываем новую командную строку на компьютере, а не на сервере. Для этого нужно запустить ещё одно окно терминала. Там пишем такое:

scp /Users/mihailpolanin/Downloads/bot.py mpolyanin@77.222.61.9:bot

  • scp — копирование файла по SSH;
  • /Users/mihailpolanin/Downloads/bot.py — это путь к нашему скрипту на компьютере. Его замените на то, что будет у вас;
  • mpolyanin@77.222.61.9 — адрес сервера и логин пользователя. Это тоже замените на ваши данные;
  • : — отделяет сервер от папки;
  • bot — название папки, которую мы только что создали на сервере.

Лайфхак: чтобы не писать вручную пути до файлов на локальном компьютере, можно перед началом ввода пути просто перетащить файл в окно терминала. Терминал поймёт, что вы имели в виду «путь до этого файла», и подставит данные сам.

После запуска у нас попросят пароль от сервера — вводим его и видим статистику отправки файла:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Переключаемся обратно в SSH-соединение и проверяем, что файл скопировался и лежит в папке. Для этого вводим две команды: первая перейдёт в эту папку, а вторая покажет её содержимое:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Готовим файл для работы службы

Нам нужно, чтобы система сама следила за тем, чтобы скрипт работал всё время и запускался после перезагрузки. В Linux за это отвечают службы — одну из таких служб мы сейчас и сделаем.

Читайте также:  Линукс минт кнопка выключения

Создаём на компьютере новый файл bot.service и вставляем туда такое:

[Unit] Description=tg-bot After=multi-user.target [Service] User=root Group=root Type=simple Restart=always ExecStart=/usr/bin/python3 /bot/bot.py [Install] WantedBy=multi-user.target

Два самых важных параметра — это путь к нашему скрипту (/bot/bot.py) и название службы: tg-bot. Название может быть любым, а вот путь к скрипту нужно указать точно.

Теперь закидываем этот файл на сервер в папку /usr/lib/systemd/system. Для этого в командной строке компьютера пишем:

scp /Users/mihailpolanin/Downloads/bot.service mpolyanin@77.222.61.9:/usr/lib/systemd/system

Как и раньше, не забудьте заменить адрес до файла .service на вашем компьютере, а также имя пользователя и адрес сервера. Первый адрес можно не писать вручную, а перетащить файл в терминал сразу после набора команды scp.

Запуск службы

Теперь нам нужно перезагрузить все службы, чтобы наш файл тоже попал в общий список для запуска. Открываем SSH-консоль и выполняем там такую команду:

sudo systemctl daemon-reload

И сразу включим наш сервис, чтобы он не отключался при перезагрузке сервера:

sudo systemctl enable bot.service

Всё, можно запускать наш телеграм-бот как службу. Вот основные команды для этого:

  • sudo systemctl start bot.service — запустить службу;
  • sudo systemctl stop bot.service — остановить службу;
  • sudo systemctl status bot.service — посмотреть статус, работает или нет.

Что дальше

В следующий раз сделаем ещё круче — настроим систему мониторинга на сервере, чтобы нам на почту приходило сообщение, когда служба перезапускается или останавливается с ошибкой. Подпишитесь, чтобы не пропустить.

Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!

В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.

Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию

Chrome OS — операционная система из браузера

Работает быстро, но с множеством ограничений

Что такое цепи Маркова и как они работают

Простой способ сгенерировать много текста, который будет похож на настоящий.

Что такое обратная матрица

Сложная тема из линейной алгебры.

Как работают пуш-уведомления

Простое объяснение простой технологии

Как работает приложение Maps.me

Разговор с создателем технологии

Программисты из SpaceX отвечают на вопросы про разработку

Переводим для вас популярный тред из Reddit.

Источник

Запуск Python скрипта в виде службы через systemctl/systemd

Есть несколько способов запуска вашей программы в качестве фоновой службы в Linux, таких как crontab, .bashrc и т. д., но сегодня будет разговор о systemd. Изначально я искал способ запустить свой скрипт на Python в качестве фоновой службы, поэтому даже если сервер по какой-то причине перезагрузится, мой скрипт все равно должен работать в фоновом режиме, после небольшого ресерча и я обнаружил, что systemd позволяет мне это сделать. Давайте начнем.

Настройки далее будут производиться на машине с Ubuntu 20.04.

Почти все версии Linux поставляются с systemd из коробки, но если у вас его нет, вы можете просто запустить следующую команду:

sudo apt install -y systemd 

Примечание. Флаг -y означает быструю установку пакетов и зависимостей.

Чтобы проверить, какая версия systemd у вас установлена, просто выполните команду:

Создайте файл python с любым именем. Я назову свой скрипт именем test.py.

import time from datetime import datetime while True: with open("timestamp.txt", "a") as f: f.write("Текущая временная метка: " + str(datetime.now())) f.close() time.sleep(10) 

Приведенный выше скрипт будет записывать текущую метку времени в файл каждые 10 секунд. Теперь напишем сервис.

sudo nano /etc/systemd/system/test.service 

(имя службы, которая тестируется в этом случае)

[Unit] Description=My test service After=multi-user.target [Service] User=deepak Group=admin Type=simple Restart=always ExecStart=/usr/bin/python3 /home//test.py [Install] WantedBy=multi-user.target 

Замените имя пользователя в вашей ОС, где написано . Флаг ExecStart принимает команду, которую вы хотите запустить. Таким образом, в основном первый аргумент — это путь к python (в моем случае это python3), а второй аргумент — это путь к скрипту, который необходимо выполнить. Флаг перезапуска всегда установлен, потому что я хочу перезапустить свою службу, если сервер будет перезапущен.

Читайте также:  Make linux disk image

Здесь мы определили User=deepak и Group=admin, чтобы убедиться, что скрипт будет выполняться только от имени пользователя deepak, входящего в группу admin.

Теперь нам нужно перезагрузить демон.

sudo systemctl daemon-reload 

Давайте включим наш сервис, чтобы он не отключался при перезагрузке сервера.

sudo systemctl enable test.service 

А теперь давайте запустим наш сервис.

sudo systemctl start test.service 

Теперь наш сервис работает.

Примечание. Файл будет записан в корневой каталог (/), потому что программа запишет путь с точки зрения systemd. Чтобы изменить это, просто отредактируйте путь к файлу. Например:

import time from datetime import datetime path_to_file = "введите желаемый путь к файлу" while True: with open(path_to_file, "a") as f: f.write("Текущая временная метка: " + str(datetime.now())) f.close() time.sleep(10) 

Есть несколько команд, которые вы можете выполнить для запуска, остановки, перезапуска и проверки состояния.

sudo systemctl stop name_of_your_service 
sudo systemctl restart name_of_your_service 
sudo systemctl status name_of_your_service 

Это было очень поверхностное знакомство с systemd, предназначенное для новичков, которые хотят начать писать свои собственные systemd службы для python.

ПРИМЕЧАНИЕ. Это относится не только к сценариям Python. Вы можете запустить любую программу с ним, независимо от языка программирования, на котором написана ваша программа.

Источник

Creating a Linux service with systemd¶

Once in a while, you need to create a script and run it in the background. There are a few approaches that you can take. Probably the simplest one is to just add a & to the end of the command. Also, if you want to close the terminal, append nohup . If your script exists for some reason, you would need to restart it manually.

The better approach is to use the systemd system and service manager for Linux. In this tutorial, I’ll show you how to create a simple systemd service that can run your script in the background and restart it in case of failure.

Create Python HTTP Server¶

First of all, let’s create a simple Python HTTP server.

We’re going to run in on localhost:8080 . It will accept only HTTP GET requests and return Hello string back to the client. We can also allow the user to exit the program by hitting Control-C or Delete key on a keyboard.

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 from http.server import BaseHTTPRequestHandler, HTTPServer hostName = "localhost" serverPort = 8080 class MyServer(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(bytes("Hello\n", "utf-8")) if __name__ == "__main__": webServer = HTTPServer((hostName, serverPort), MyServer) print("Server started http://%s:%s" % (hostName, serverPort)) try: webServer.serve_forever() except KeyboardInterrupt: pass webServer.server_close() 

Let’s try to run in the foreground first and make sure that it works.

Читайте также:  Руководство для начинающих linux

Then open a new tab and try to access the server with the curl command.

If you get a Hello message from the server, that means it works. Now we want this HTTP server to run all the time, be restarted in case of a failure, and even survive Linux restarts. That’s where systemd comes into play.

Create Systemd Linux Service¶

Let’s go ahead and create a systemd service file.

 sudo vim /etc/systemd/system/my-server.service 

It’s the bare minimum configuration to get you started. Make sure to specify your Linux User and a ExecStart command to start the server. You can also provide Environment variables to your script.

The important parameter is a Restart . You can either set it to always or restart your script only on-failure . By default, when you configure Restart=always as we did, the systemd gives up restarting your service if it fails to start more than 5 times within a 10 seconds interval.

The RestartSec directive also has an impact on the outcome: if you set it to restart after 3 seconds, then you can never reach 5 failed retries within 10 seconds.

The simple fix that always works is to set StartLimitIntervalSec=0 . This way, the systemd will attempt to restart your service forever. It’s a good idea to set RestartSec to at least 1 second, though, to avoid putting too much stress on your server when things start going wrong.

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
 [Unit] Description=My Server After=network.target StartLimitIntervalSec=0 [Service] Type=simple ExecStart=/usr/bin/python3 /home/ubuntu/my_server.py User=ubuntu Environment=ENV=production Restart=always RestartSec=1 [Install] WantedBy=multi-user.target 

Now let’s test the system service. Go ahead and start the server.

 sudo systemctl start my-server 

To automatically start your service when Linux boots up, enable the service.

 sudo systemctl enable my-server 
 sudo systemctl status my-server 

In case it fails, and you need to find a reason, or you just want to follow the logs, you can use a journactl command.

 journalctl -u my-server -f --no-pager 

The last thing that I want to discuss in this video is that you can manage dependencies for your service. For example, if your server needs a database, you may use After=postgresql.service directive to instruct systemd to start your python server only after the Postgres starts. This will only work when the Linux boots up and both services are enabled.

If you want, you can add another Requires=postgresql.service directive. Even if the Progress is down and you try to start your Python server, the systemd first starts the Postgres and then your program.

Systemd has been the default system and service manager for Linux in RHEL/CentOS, Fedora, Ubuntu, Debian, and others for several years now, and it should become your go-to tool to run services and your scripts in the background.

Источник

Оцените статью
Adblock
detector