Иногда требуется какой-то скрипт или программу запускать как системный сервис. Это можно легко провернуть, если в вашем дистрибутиве используется система инициализации и управления демонами — systemd.
Для примера, я создам простейший python-скрипт который будет слушать 9988 порт и добавлю его в автозагрузку при старте операционной системы.
1. Простой python-scrypt
sudo nano /usr/bin/dummy_service.py
Код скрипта:
#!/usr/bin/python3 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost", 9988)) s.listen(1) while True: conn, addr = s.accept() data = conn.recv(1024) conn.close() my_function_that_handles_data(data)
2. Создание файла сервиса.
Теперь создадим файл сервиса для с помощью которого расскажем systemd что нам требуется. Файл должен иметь расширение .service и находиться в директории /lib/systemd/system/
sudo nano /lib/systemd/system/dummy.service
Добавим информацию о нашем сервисе (можете изменить местоположение скрипта и описание сервиса):
[Unit] Description=Dummy Service After=multi-user.target Conflicts=getty@tty1.service [Service] Type=simple ExecStart=/usr/bin/python3 /usr/bin/dummy_service.py StandardInput=tty-force [Install] WantedBy=multi-user.target
Мне кажется из содержимого всё и так понятно — какая строка и за что отвечает.
3. Включение нового добавленного сервиса.
Вы добавили, наконец-то, ваш сервис в систему. теперь необходимо перезапустить демон systemctl чтобы он прочел новый файл. Каждый раз как вы вносите изменения в .service файлы вам нужно перезапустить демон.
sudo systemctl daemon-reload
Теперь включим запуск сервиса при загрузке системы, и запустим сам сервис.
sudo systemctl enable dummy.service sudo systemctl start dummy.service
4. Запуск/Остановка/Статус сервиса
В конце проверим статус нашего нового сервиса:
sudo systemctl status dummy.service
Проверим что наш python-скрипт слушает нужный нам порт:
sudo lsof -i | grep 9988
Команды для запуска, остановки и перезапуска сервиса:
sudo systemctl stop dummy.service #Для остановки сервиса sudo systemctl start dummy.service #Для запуска сервиса sudo systemctl restart dummy.service #Для перезапуска сервиса