Рейтинг:2

Как создать службу Python 3, которая использует сокет с systemd?

флаг us

Я пытаюсь создать службу с помощью systemd, где я использую python3 для создания простого сокета и оставляю его в качестве демона, но я предпринял несколько попыток, но в обоих случаях безуспешно.На сегодняшний день меня победил systemd, но завтра еще один день, чтобы попробовать.

Сервер

импортный сокет 
хост = '127.0.0.1'
порт = 9999
BUFFER_SIZE = 1024 

с socket.socket(socket.AF_INET, socket.SOCK_STREAM) как socket_tcp:
    socket_tcp.bind((хост, порт)) 
    socket_tcp.listen(5) # Уведомление о соединении с клиентом 
    conn, addr = socket_tcp.accept() # Стабильное соединение с клиентом 
    с подключением:
        print('[*] Conexión establecida') 
        пока верно:
            # Recibimos bytes, convertimos en str
            данные = conn.recv (BUFFER_SIZE)
            # Verificamos que hemos recibido datos
            если не данные:
                сломать
            еще:
                print('[*] Datos recibidos: {}'.format(data.decode('utf-8'))) 
            conn.send(data) # Hacemos echo convirtiendo de nuevo a bytes

Клиент

импортный сокет
# El cliente debe tener las mismas especificaciones del servidor
хост = '127.0.0.1'
порт = 9999

BUFFER_SIZE = 1024 MESSAGE = 'Привет, мир!' # Данные, которые запрашиваются с помощью socket.socket(socket.AF_INET, socket.SOCK_STREAM) as socket_tcp:
    socket_tcp.connect((хост, порт))
    # Конвертируем строку в байты
    socket_tcp.send(MESSAGE.encode('utf-8'))
    данные = socket_tcp.recv (BUFFER_SIZE)

Файл конфигурации

судо нано /etc/systemd/system/socket_prueba.service
sudo rm -r /etc/systemd/system/socket_prueba.service
[Ед. изм]
Описание= Система ретрансляции сервера: Менеджер
After=multi-user.target

[Оказание услуг]
Тип=простой
Перезапустить = всегда
ExecStart=/usr/local/bin/pipenv запустить python /path/test_server.py

[Установить]
WantedBy=многопользовательская.цель

sudo systemctl демон-перезагрузка
sudo systemctl включить socket_prueba.service
sudo systemctl запустить socket_prueba.service
статус sudo systemctl socket_prueba.service

Результат:

socket_prueba.service — Система ретрансляции серверов: Менеджер
     Загружено: загружено (/etc/systemd/system/socket_prueba.service; включено; предустановка поставщика: включена)
     Активно: сбой (результат: код выхода) с сб 2021-09-25 16:07:17 -05; 58 минут назад
    Процесс: 25771 ExecStart=/usr/local/bin/pipenv запустить python 

/дом/путь>
   Основной PID: 25771 (код=выход, статус=2)

25 сентября, 16:07:17 serveraas systemd[1]: socket_prueba.service: запланированное задание перезапуска, счетчик перезапусков >
25 сентября 16:07:17 serveraas systemd[1]: остановлена ​​система ретрансляции сервера: менеджер.
25 сентября 16:07:17 serveraas systemd[1]: socket_prueba.service: Запрос на запуск повторяется слишком быстро.
25 сентября, 16:07:17 serveraas systemd[1]: socket_prueba.service: Ошибка с результатом «код выхода».
25 сентября, 16:07:17 serveraas systemd[1]: не удалось запустить систему ретрансляции сервера: диспетчер.

Интенто 2 Источник: системд и питон

сокет с python и systemd

socket_prueba.socket - Сокет пруэба
     Загружено: загружено (/etc/systemd/system/socket_prueba.socket; отключено; предустановка поставщика: включена)
     Активно: сбой (результат: service-start-limit-hit) с субботы 2021-09-25 17:00:47 -05; 4 с назад
   Триггеры: socket_prueba.service
     Прослушать: 127.0.0.1:9999 (поток)

25 сент., 17:00:47 vidm-OMEN systemd[1]: прослушивание через Socket prueba.
25 сентября, 17:00:47 vidm-OMEN systemd[1]: socket_prueba.socket: Ошибка с результатом «service-start-limit-hit».
Michael Hampton avatar
флаг cz
Проверьте журнал, чтобы узнать, что произошло, например. `journalctl -l -u socket_prueba.service`
Рейтинг:3
флаг us

Вот готовые простые команды развертывания оболочки для вашего случая, вы можете изменить каталоги, имя, описание службы или скрипта и т. Д., Описание приведено ниже:

Сделать директорию и сам скрипт

mkdir /usr/src/python-сокет -p

кошка > /usr/src/python-socket/python-socket.py << 'EOL'
импортный сокет 
хост = '127.0.0.1'
порт = 9999
BUFFER_SIZE = 1024 

с socket.socket(socket.AF_INET, socket.SOCK_STREAM) как socket_tcp:
    socket_tcp.bind((хост, порт)) 
    socket_tcp.listen(5) # Уведомление о соединении с клиентом 
    conn, addr = socket_tcp.accept() # Стабильное соединение с клиентом 
    с подключением:
        print('[*] Conexión establecida') 
        пока верно:
            # Recibimos bytes, convertimos en str
            данные = conn.recv (BUFFER_SIZE)
            # Verificamos que hemos recibido datos
            если не данные:
                сломать
            еще:
                print('[*] Datos recibidos: {}'.format(data.decode('utf-8'))) 
            conn.send(data) # Hacemos echo convirtiendo de nuevo a bytes
EOL

Настройте переменные для создания службы systemd

SERVICE_NAME=python-сокет
SERVICE_DESCRIPTION="Тестовый сервис Python"
SERVICE_COMMAND="/usr/bin/python3 /usr/src/python-socket/python-socket.py"
SERVICE_WORK_DIR=/usr/src/python-сокет/
SERVICE_USER=корень

Развернуть конфигурацию службы systemd

кошка > /etc/systemd/system/${ИМЯ_СЛУЖБЫ}.service << EOL
[Ед. изм]
Описание=${SERVICE_DESCRIPTION}
After=multi-user.target

[Оказание услуг]
Среда = "ОТ = СИСТЕМА"
Рабочий каталог=${SERVICE_WORK_DIR}
Тип=простой
Пользователь=${SERVICE_USER}
ExecStart=${SERVICE_COMMAND}
RemainAfterExit=нет
Перезапустить = всегда
Рестартсек=2
StartLimitBurst=999999
Стартлимитинтервал=0
KillMode=процесс

[Установить]
WantedBy=многопользовательская.цель
EOL

Примените новый сервис, запустите его и проверьте

systemctl демон-перезагрузка
systemctl включить ${SERVICE_NAME}
systemctl остановить ${SERVICE_NAME}
systemctl запустить ${SERVICE_NAME}
статус systemctl ${SERVICE_NAME}

В результате ваша конфигурация службы systemd будет выглядеть так:

[Ед. изм]
Description=Тестовый сервис Python
After=multi-user.target

[Оказание услуг]
Среда = "ОТ = СИСТЕМА"
Рабочий каталог=/usr/src/python-сокет/
Тип=простой
Пользователь=корень
ExecStart=/usr/bin/python3 /usr/src/python-socket/python-socket.py
RemainAfterExit=нет
Перезапустить = всегда
Рестартсек=2
StartLimitBurst=999999
Стартлимитинтервал=0
KillMode=процесс

[Установить]
WantedBy=многопользовательская.цель

Где:

Среда = "ОТ = СИСТЕМА" - некоторая переменная env, если вы хотите перейти к вашему скрипту Python

Тип=простой - простой сервис systemd, он будет работать, пока скрипт работает

RemainAfterExit=нет
Перезапустить = всегда
Рестартсек=2
StartLimitBurst=999999
Стартлимитинтервал=0

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

KillMode=процесс - Вот как ваш скрипт остановится, если у вас нет специальных событий SIG в вашем скрипте Python, он универсальный

Ответить или комментировать

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