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

Основы

Если ты еще никогда не делал свои сервисы, начнем с основ. 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».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Check Also

Malware vs WordPress. Проверяем защитные плагины в боевых условиях

Wordpress — одна из самых распространенных систем управления сайтом и поэтому вызывает при…

Оставить мнение