несоответствие протокола готовности
Как и предполагал Виланд, Type
услуги важны. Этот параметр обозначает, какой протокол готовности systemd ожидает, что служба будет говорить. Предполагается, что simple
услуга немедленно готова. forking
Служба берется , чтобы быть готовым после его первоначальный процесс разветвляется ребенка , а затем завершает свою работу. dbus
Служба берется , чтобы быть готовым , когда на Desktop Bus появляется сервер. И так далее.
Если вы не получите протокол готовности, объявленный в сервисном модуле, чтобы он соответствовал тому, что делает сервис, тогда все пошло не так. Несоответствия протокола готовности приводят к тому, что службы запускаются некорректно или (чаще) диагностируются (ошибочно) системой systemd как сбой. Когда служба считается не способной запустить systemd, она гарантирует, что каждый потерянный дополнительный процесс службы, который мог остаться запущенным как часть сбоя (с его точки зрения), завершается, чтобы надлежащим образом вернуть службу в неактивное состояние. государство.
Вы делаете именно это.
Прежде всего, простые вещи: sh -c
не соответствует Type=simple
или Type=forking
.
В simple
протоколе, начальный процесс берется быть процесс обслуживания. Но на самом деле sh -c
оболочка запускает реальную сервисную программу как дочерний процесс . Так что MAINPID
пойдет не так и ExecReload
перестает работать, для начала. При использовании Type=simple
нужно либо использовать, sh -c 'exec …'
либо не использовать sh -c
в первую очередь. Последнее чаще является правильным курсом, чем думают некоторые.
sh -c
не соответствует Type=forking
ни. Протокол готовности к forking
услуге довольно специфичен. Начальный процесс должен разветвить ребенка, а затем выйти. systemd применяет тайм-аут к этому протоколу. Если начальный процесс не разветвляется в течение выделенного времени, это не готовность к готовности. Если начальный процесс не завершается в течение отведенного времени, это тоже сбой.
ненужный ужас, который ossec-control
Что приводит нас к сложным вещам: этот ossec-control
сценарий.
Оказывается , это rc
сценарий System 5, который запускает от 4 до 10 процессов, которые, в свою очередь, тоже разветвляются и выходят. Это один из тех rc
сценариев System 5, который пытается управлять целым набором серверных процессов в одном сценарии с for
циклами, состояниями гонки, произвольными значениями, sleep
чтобы попытаться их избежать, режимами сбоев, которые могут задушить систему в начальном состоянии, и все остальные ужасы, которые заставили людей изобретать такие вещи, как AIX System Resource Controller и daemontools два десятилетия назад. И давайте не будем забывать скрытый сценарий оболочки в двоичном каталоге, который он переписывает на лету, для реализации уникальных enable
и disable
глаголов.
Итак, когда вы, /bin/sh -c '/var/ossec/bin/ossec-control start'
что происходит, это:
- systemd разветвляет процесс обслуживания.
- Это оболочка, которая разветвляется
ossec-control
.
- Это в свою очередь раздваивает от 4 до 10 внуков.
- Внуки все разветвляются и выходят по очереди.
- Все правнуки разветвляются и выходят параллельно.
ossec-control
выходы.
- Первая оболочка выходит.
- Процессы обслуживания были большие-пра внуков, а потому , что этот путь рабочих матчей ни
forking
ниsimple
протокол готовности, Systemd не считает службу в целом, не удалось , и закрывает его обратно вниз.
Ничто из этого ужаса на самом деле не нужно в systemd вообще. Ничего из этого.
системный сервисный шаблон
Вместо этого пишется очень простой шаблонный блок :
[Единица измерения]
Описание = Сервер OSSEC HIDS% i
После того, как = network.target
[Обслуживание]
Тип = простой
ExecStartPre = / usr / bin / env / var / ossec / bin /% p-% i -t
ExecStart = / usr / bin / env / var / ossec / bin /% p-% i -f
[Установить]
WantedBy = multi-user.target
Сохраните это как /etc/systemd/system/ossec@.service
.
Различные реальные сервисы являются экземплярами этого шаблона и называются:
ossec@dbd.service
ossec@agentlessd.service
ossec@csyslogd.service
ossec@execd.service
ossec@agentd.service
ossec@logcollector.service
ossec@syscheckd.service
ossec@maild.service
ossec@analysisd.service
ossec@remoted.service
ossec@monitord.service
Затем функция включения и выключения поступает прямо из системы управления службами (с исправленной ошибкой RedHat 752774 ), без необходимости скрытых сценариев оболочки.
systemctl включить ossec @ dbd ossec @ agentlessd ossec @ csyslogd ossec @ maild ossec @ execd ossec @ analysisd ossec @ logcollector ossec @ удаленный ossec @ syscheckd ossec @ monitord
Кроме того, systemd узнает и отслеживает каждую реальную службу напрямую. Он может фильтровать их журналы с journalctl -u
. Он может знать, когда произошел сбой отдельной службы. Он знает, какие службы должны быть включены и запущены.
Кстати, Type=simple
и -f
вариант здесь, как и во многих других случаях. Очень немногие службы в дикой природе фактически сигнализируют о своей готовности посредством exit
, и это тоже не такие случаи. Но это то, что forking
означает тип. Службы в дикой природе в основном просто разветвляются и выходят из-за ошибочно полученного мудрого представления о том, что именно этим и должны заниматься демоны. На самом деле это не так. Это не было с 1990-х годов. Пришло время наверстать упущенное.
дальнейшее чтение