Невідповідність протоколу готовності
Як випливає з Віленда, Type
послуга важлива. Цей параметр позначає, який протокол готовності systemd очікує, що служба зможе говорити. Передбачається, що simple
послуга буде негайно готова. forking
Служба береться , щоб бути готовим після його первісний процес розгалужується дитини , а потім завершує свою роботу. dbus
Служба береться , щоб бути готовим , коли на Desktop Bus з'являється сервер. І так далі.
Якщо ви не отримаєте протокол готовності, декларований в сервісному блоці, щоб відповідати тому, що робить служба, то все піде не так Невідповідність протоколу готовності призводить до того, що служби не запускаються належним чином, або (частіше) діагностуються системою (неправильно), як система не працює. Коли сервіс вважається таким, що не запускається 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
s, щоб намагатися їх уникнути, режими відмов, які можуть заглушити систему в напівзапущеному стані, і всі інші жахи, які змусили людей вигадувати такі речі, як контролер системних ресурсів AIX та демомонтоли два десятиліття тому. І не будемо забувати прихований скрипт оболонки у двійковому каталозі, який він переписує на льоту, щоб реалізувати ідіосинкратичність enable
та disable
дієслова.
Отже, коли ви, /bin/sh -c '/var/ossec/bin/ossec-control start'
що відбувається, це:
- systemd роздвоює те, що він очікує на сервісний процес.
- Це оболонка, яка роздрібнюється
ossec-control
.
- Що в свою чергу розщеплює від 4 до 10 онуків.
- Онуки все роз’їжджають і виходять по черзі.
- Праправнуки все роз’їжджають і виходять паралельно.
ossec-control
виходи.
- Перша оболонка виходить.
- Процеси обслуговування були великі-пра онуків, а тому , що цей шлях робочих матчів ні
forking
ніsimple
протокол готовності, 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 = багатокористувач
Збережіть це як /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 @ analizad ossec @ logcollector ossec @ віддалений ossec @ syscheckd ossec @ monitord
Більше того, systemd дізнається про та відстежує кожну фактичну послугу безпосередньо. Він може фільтрувати їхні журнали за допомогою journalctl -u
. Він може знати, коли окремий сервіс вийшов з ладу. Він знає, які послуги повинні бути включені та запущені.
До речі: Type=simple
і -f
варіант є настільки ж правильним, як і у багатьох інших випадках. Дуже мало служб у дикій природі насправді сигналізує про свою готовність за допомогою мастила exit
, і це теж не такі випадки. Але ось що forking
означає тип. Служби в дикій природі в основному - лише роздвоєння та виїзд через помилкове уявлення про мудрість, що саме так слід робити. Насправді це не так. Це було не з 1990-х. Пора наздогнати.
Подальше читання