Файл юнита — настройка для systemd, а не сценарий оболочки. В этом шаге — его секции и главные строки.
Вот файл lab-worker целиком:
Строки разложены по секциям:
| Секция | Что в ней |
|---|---|
[Unit] |
описание службы и порядок запуска среди других юнитов |
[Service] |
как запускать программу: Type, User, ExecStart, Restart |
[Install] |
к какой цели подключать службу при enable — WantedBy |
User — от какого пользователя запускать программу; без этой строки системная служба работает от root. Для своей службы обычно заводят отдельную учётную запись без входа в систему: sudo useradd -r -s /usr/sbin/nologin myapp (useradd). Type=exec значит, что запуск удался, когда программа начала выполняться.
ExecStart systemd выполняет сам, без оболочки. Поэтому путь к программе в нём полный, а |, >, & и ~ там не работают: программа получит их как обычные слова.
В юните службы написали ExecStart=/usr/bin/echo ready > /tmp/ready. Что будет после запуска службы?
-
systemd не разбирает
>и не спорит с ним: он запускает/usr/bin/echoи отдаёт ему все слова строки. -
>понимает оболочка, а systemd запускает программу без неё: echo получит>и/tmp/readyкак обычные слова. -
У службы нет терминала: то, что программа печатает, systemd пишет в журнал службы.
systemd запускает программу из ExecStart без оболочки, поэтому > и путь достаются echo как слова, и она печатает их в журнал службы. Когда оболочка правда нужна, её вызывают явно: ExecStart=/bin/sh -c '…'.
Главное в шаге
-
Секция
[Service]говорит, как запускать:ExecStart— программа без оболочки,User— от кого,Restart— когда запускать заново. -
[Install]нужна дляenable:WantedByназывает цель, к которой подключится служба.