Wykonywanie poleceń
Zabbix korzysta ze wspólnych funkcji na potrzeby kontroli zewnętrznych, parametrów użytkownika, pozycji system.run, niestandardowych skryptów alertów, poleceń zdalnych i skryptów globalnych.
Wszystkie polecenia i skrypty są wykonywane z uprawnieniami użytkownika systemu operacyjnego, który uruchamia agenta Zabbix. Użytkownik musi mieć wystarczające uprawnienia do wykonania polecenia lub skryptu.
Kroki wykonywania
Domyślnie wszystkie skrypty w Zabbix są wykonywane przy użyciu powłoki sh i nie można zmienić domyślnej powłoki. Aby użyć innej powłoki, można zastosować obejście: utworzyć plik skryptu i wywołać ten skrypt podczas wykonywania polecenia.
Polecenie lub skrypt jest wykonywane w podobny sposób na platformach Unix i Windows:
- Zabbix (proces nadrzędny) tworzy potok do komunikacji.
- Zabbix ustawia potok jako wyjście dla procesu potomnego, który ma zostać utworzony.
- Zabbix tworzy proces potomny (uruchamia polecenie/skrypt).
- Dla procesu potomnego tworzona jest nowa grupa procesów (w systemie Unix) lub zadanie (w systemie Windows).
- Zabbix odczytuje dane z potoku do momentu wystąpienia limitu czasu lub gdy nikt nie zapisuje na drugim końcu (WSZYSTKIE uchwyty/deskryptory plików zostaną zamknięte). Należy pamiętać, że proces potomny może utworzyć więcej procesów i zakończyć działanie, zanim te procesy zakończą działanie lub zamkną uchwyt/deskryptor pliku.
- Jeśli limit czasu nie został osiągnięty, Zabbix czeka, aż początkowy proces potomny zakończy działanie lub wystąpi limit czasu.
- Jeśli początkowy proces potomny zakończy działanie przed osiągnięciem limitu czasu, Zabbix sprawdza kod zakończenia początkowego procesu potomnego i porównuje go z
0. Niezerowy kod zakończenia jest uznawany za błąd wykonania, ale tylko w przypadku niestandardowych skryptów alarmowych, zdalnych poleceń i skryptów użytkownika wykonywanych na serwerze Zabbix lub proxy Zabbix. - W tym momencie zakłada się, że wszystko zostało zakończone, a całe drzewo procesów (tj. grupa procesów lub zadanie) zostaje zakończone.
Zabbix zakłada, że przetwarzanie polecenia/skryptu zostało zakończone, gdy początkowy proces potomny zakończył działanie ORAZ żaden inny proces nadal nie utrzymuje otwartego uchwytu/deskryptora pliku wyjściowego. Po zakończeniu przetwarzania WSZYSTKIE utworzone procesy zostają zakończone.
Wszystkie cudzysłowy i ukośniki odwrotne w poleceniu są poprzedzane ukośnikami odwrotnymi, a polecenie jest ujmowane w cudzysłowy.
Sprawdzanie kodu wyjścia
Kod wyjścia jest sprawdzany w następujących przypadkach:
- Tylko w przypadku niestandardowych skryptów alertów, zdalnych poleceń i skryptów użytkownika wykonywanych na serwerze Zabbix i proxy Zabbix.
- Każdy kod wyjścia różny od
0jest uznawany za błąd wykonania. - Zawartość standardowego strumienia błędów i standardowego strumienia wyjścia dla nieudanych wykonań jest zbierana i dostępna we frontendzie (w miejscu wyświetlania wyniku wykonania).
- Dodatkowy wpis w dzienniku może zostać utworzony dla zdalnych poleceń wykonywanych na agencie/proxy Zabbix po włączeniu parametru LogRemoteCommands na agencie/proxy.
Możliwe komunikaty we frontendzie i wpisy w dzienniku dotyczące nieudanych poleceń lub skryptów:
- Zawartość standardowego strumienia błędów i standardowego strumienia wyjścia dla nieudanych wykonań (jeśli istnieje).
Process exited with code: N.(dla pustego wyjścia i kodu wyjścia różnego od0).Process killed by signal: N.(dla procesu zakończonego przez sygnał, tylko w systemie Linux).Process terminated unexpectedly.(dla procesu zakończonego z nieznanych przyczyn).