Невідповідність протоколу готовності
Як випливає з Віленда, 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циклами, умовами перегонів, довільним sleeps, щоб намагатися їх уникнути, режими відмов, які можуть заглушити систему в напівзапущеному стані, і всі інші жахи, які змусили людей вигадувати такі речі, як контролер системних ресурсів 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-х. Пора наздогнати.
Подальше читання