niedopasowanie protokołu gotowości
Jak sugerował Wieland, Typeusługa jest ważna. To ustawienie oznacza, który system protokołu gotowości oczekuje, że usługa będzie mówić. simpleUsługa zakłada się natychmiast gotowy. forkingUsługa zostanie podjęta ma być gotowy po jego początkowy proces rozwidla dziecko i następnie kończy działanie. dbusUsł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 -cnie pasuje Type=simplelub Type=forking.
W simpleprotokole proces początkowy jest traktowany jako proces serwisowy. Ale w rzeczywistości sh -copakowanie uruchamia rzeczywisty program serwisowy jako proces potomny . Więc MAINPIDidzie źle i ExecReloadprzestaje działać, na początek. Podczas korzystania Type=simplenależ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 -cteż nie pasuje Type=forking. Protokół gotowości forkingusł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-controlskryptu.
Okazuje się , że jest to rcskrypt Systemu 5, który uruchamia od 4 do 10 procesów, które same z kolei rozwidlają się i wychodzą. Jest to jeden ze rcskryptów System 5, który próbuje zarządzać całym zestawem procesów serwera w jednym skrypcie, z forpętlami, warunkami wyścigu, arbitralnymi próbami sleepich 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 enablei disableczasowniki.
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=simplei -fopcje 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 forkingoznacza 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