Несмотря на множество проблем и противоречивые чувства пользователей, systemd уже стал стандартом де-факто в большинстве дистрибутивов Linux. С его помощью создать несложный сервис можно за пару минут и десяток строк настроек. В то же время многие более интересные возможности документированы не очень понятным языком или требуют углубленных познаний в тонкостях работы systemd.
Если ты еще никогда не делал свои сервисы, начнем с основ. Systemd оперирует абстрактными единицами (unit), которые бывают разных типов, могут предоставлять различные ресурсы (процессы, сокеты, абстрактные «цели») и требовать других ресурсов для запуска.
Самый распространенный вид ресурса — сервис (service). Файлы с описаниями сервисов и всего прочего лежат в каталоге /lib/systemd/system/
. Чтобы systemd нашел новый сервис, достаточно положить в этот каталог свой файл. Если этот сервис ранее не существовал, systemd прочитает файл и загрузит его в память. Однако, если ты редактируешь файл ранее запущенного сервиса, не забудь заставить systemd перечитать файлы командой sudo systemctl daemon-reload
!
Когда-то стандартным способом добавить выполнение команд в загрузку системы было дописать их в /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 Score! Подробнее
1 год5380 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости