Содержание статьи
Основы
Если ты еще никогда не делал свои сервисы, начнем с основ. Systemd оперирует абстрактными единицами (unit), которые бывают разных типов, могут предоставлять различные ресурсы (процессы, сокеты, абстрактные «цели») и требовать других ресурсов для запуска.
Самый распространенный вид ресурса — сервис (service). Файлы с описаниями сервисов и всего прочего лежат в каталоге /lib/systemd/system/
. Чтобы systemd нашел новый сервис, достаточно положить в этот каталог свой файл. Если этот сервис ранее не существовал, systemd прочитает файл и загрузит его в память. Однако, если ты редактируешь файл ранее запущенного сервиса, не забудь заставить systemd перечитать файлы командой sudo systemctl daemon-reload
!
Сервисы типа oneshot — долой rc.local
Когда-то стандартным способом добавить выполнение команд в загрузку системы было дописать их в /etc/rc.local. Очевидный недостаток — нет способов следить, насколько успешно они выполнились. В systemd легко создать для такой цели свой сервис типа oneshot, и им можно будет управлять через systemctl, как любым другим. В этом случае systemd выполнит команду и посчитает запуск сервиса успешным, если она завершилась с кодом ноль.
Сохраним следующий файл в /lib/systemd/system/dumb-test.service
:
[Unit]
Description=Dumb test
[Service]
ExecStart=/bin/true
Type=oneshot
[Install]
WantedBy=multiuser.target
Дополнительных действий не требуется, и теперь ты можешь делать с ним все то же, что с системными сервисами: запустить с помощью sudo systemctl start dumb-test.service
, поставить на загрузку с помощью sudo systemctl enable dumb-test.service
и так далее.
Делаем сервис из любой программы
Любой долгоживущий процесс можно легко превратить в сервис с помощью опции Type=idle
. В этом случае systemd перехватит стандартные потоки ввода-вывода и будет следить за жизнью процесса.
Для демонстрации напишем программу на Python, которая просто выводит сообщение в бесконечном цикле. Сохраним в /usr/local/bin/test.py
следующее:
import time
while True:
print("Test service is alive")
time.sleep(5)
Затем создадим для нее файл сервиса в /lib/systemd/system/smart-test.service
:
[Unit]
Description=Smart test
[Service]
ExecStart=/usr/bin/python3 -u /usr/local/bin/test.py
Type=idle
KillMode=process
SyslogIdentifier=smart-test
SyslogFacility=daemon
Restart=on-failure
[Install]
WantedBy=multiuser.target
Теперь можно запустить наш сервис и убедиться, что он работает:
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее