niedopasowanie protokołu gotowości
Jak sugerował Wieland, Type
usługa jest ważna. To ustawienie oznacza, który system protokołu gotowości oczekuje, że usługa będzie mówić. simple
Usługa zakłada się natychmiast gotowy. forking
Usługa zostanie podjęta ma być gotowy po jego początkowy proces rozwidla dziecko i następnie kończy działanie. dbus
Usługi uważane jest gotowy, kiedy na pulpicie pojawi Bus serwer. I tak dalej.
Jeśli nie otrzymujesz zadeklarowanego w jednostce usługowej protokołu gotowości zgodnego z tym, co robi usługa, to wszystko idzie nie tak. Niedopasowania protokołu gotowości powodują, że usługi nie uruchamiają się poprawnie lub (częściej) są (błędnie) diagnozowane przez systemd jako awarie. Gdy usługa jest postrzegana jako nieudana, systemd zapewnia, że każdy osierocony dodatkowy proces usługi, który mógł pozostawać uruchomiony jako część awarii (z jego punktu widzenia), zostanie zabity w celu przywrócenia usługi do stanu nieaktywnego stan.
Robisz dokładnie to.
Przede wszystkim proste rzeczy: sh -c
nie pasuje Type=simple
lub Type=forking
.
W simple
protokole proces początkowy jest traktowany jako proces serwisowy. Ale w rzeczywistości sh -c
opakowanie uruchamia rzeczywisty program serwisowy jako proces potomny . Więc MAINPID
idzie źle i ExecReload
przestaje działać, na początek. Podczas korzystania Type=simple
należy przede wszystkim użyć sh -c 'exec …'
lub nie sh -c
. Ta ostatnia jest częściej prawidłowym kursem, niż niektórzy sądzą.
sh -c
też nie pasuje Type=forking
. Protokół gotowości forking
usługi jest dość specyficzny. Początkowy proces musi rozwidlić dziecko, a następnie wyjść. systemd stosuje limit czasu dla tego protokołu. Jeśli początkowy proces nie rozwinie się w wyznaczonym czasie, przygotowanie się nie powiedzie. Jeśli początkowy proces nie zakończy się w wyznaczonym czasie, to również oznacza błąd.
niepotrzebny horror ossec-control
Co prowadzi nas do skomplikowanych rzeczy: tego ossec-control
skryptu.
Okazuje się , że jest to rc
skrypt Systemu 5, który uruchamia od 4 do 10 procesów, które same z kolei rozwidlają się i wychodzą. Jest to jeden ze rc
skryptów System 5, który próbuje zarządzać całym zestawem procesów serwera w jednym skrypcie, z for
pętlami, warunkami wyścigu, arbitralnymi próbami sleep
ich uniknięcia, trybami awarii, które mogą udusić system w stanie częściowo uruchomionym, i wszystkie inne okropności, które sprawiły, że ludzie wymyślili takie rzeczy, jak AIX System Resource Controller i Daemontools dwie dekady temu. I nie zapominajmy o ukrytym skrypcie powłoki w katalogu binarnym, który przepisuje on w locie, aby zaimplementować idiosynkratyczne enable
i disable
czasowniki.
Więc kiedy /bin/sh -c '/var/ossec/bin/ossec-control start'
to się dzieje, to:
- systemd sprawdza, co może być procesem serwisowym.
- To skorupa, która się rozwidla
ossec-control
.
- To z kolei rozwidla od 4 do 10 wnuków.
- Wnuki wszystkie rozwidlają się i wychodzą z kolei.
- Wnuki wszystkie rozwidlają się i wychodzą równolegle.
ossec-control
wychodzi.
- Pierwszy pocisk wychodzi.
- Procesy usługowe były pra-pra- wnuki, ale dlatego, że w ten sposób meczów roboczych ani
forking
anisimple
protokół gotowość, Systemd uważa usługę jako całości nie udało i zamyka go z powrotem w dół.
Żaden z tych horrorów nie jest wcale potrzebny w systemie. Nic z tego.
systemowa jednostka usługowa szablonu
Zamiast tego pisze się bardzo prostą jednostkę szablonu :
[Jednostka]
Opis = Serwer OSSEC HIDS% i
After = network.target
[Usługa]
Typ = prosty
ExecStartPre = / usr / bin / env / var / ossec / bin /% p-% i -t
ExecStart = / usr / bin / env / var / ossec / bin /% p-% i -f
[Zainstalować]
WantedBy = multi-user.target
Zapisz to jako /etc/systemd/system/ossec@.service
.
Różne rzeczywiste usługi to instancje tego szablonu o nazwie:
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
Następnie funkcja włączania i wyłączania pochodzi bezpośrednio z systemu zarządzania usługami (z naprawionym błędem RedHat 752774 ), bez potrzeby ukrytych skryptów powłoki.
systemctl enable ossec @ dbd ossec @ agentlessd ossec @ csyslogd ossec @ maild ossec @ execd ossec @ Analysisd ossec @ logcollector ossec @ zdalny ossec @ syscheckd ossec @ monitord
Ponadto systemd poznaje i śledzi bezpośrednio każdą rzeczywistą usługę. Może filtrować ich logi journalctl -u
. Może wiedzieć, kiedy dana usługa uległa awarii. Wie, jakie usługi powinny być włączone i uruchomione.
Nawiasem mówiąc: Type=simple
i -f
opcje są tutaj tak samo, jak w wielu innych przypadkach. Bardzo niewiele usług na wolności faktycznie sygnalizuje ich gotowość dzięki exit
, a te również nie są takimi przypadkami. Ale to właśnie forking
oznacza ten typ. Usługi na wolności w głównym rozwidleniu i wyjściu z powodu jakiegoś pomyłki otrzymały pogląd mądrości, że to właśnie powinni zrobić demony. W rzeczywistości tak nie jest. Nie było tego od lat 90. Czas nadrobić zaległości.
Dalsza lektura