Befehlsausführung
Zabbix verwendet gemeinsame Funktionen für externe Prüfungen, UserParameter, system.run-Datenpunkte, benutzerdefinierte Benachrichtigungsskripte, Remote-Befehle und globale Skripte.
Alle Befehle und Skripte werden mit den Berechtigungen des Betriebssystembenutzers ausgeführt, unter dem der Zabbix Agent läuft. Der Benutzer muss über ausreichende Berechtigungen zum Ausführen des Befehls oder Skripts verfügen.
Ausführungsschritte
Standardmäßig werden alle Skripte in Zabbix mit der sh-Shell ausgeführt. Es ist nicht möglich, die Standardshell zu ändern. Um eine andere Shell zu verwenden, können Sie einen Workaround einsetzen: Erstellen Sie eine Skriptdatei und rufen Sie dieses Skript während der Befehlsausführung auf.
Der Befehl oder das Skript wird auf Unix- und Windows-Plattformen ähnlich ausgeführt:
- Zabbix (der übergeordnete Prozess) erstellt eine Pipe für die Kommunikation.
- Zabbix legt die Pipe als Ausgabe für den zu erstellenden untergeordneten Prozess fest.
- Zabbix erstellt den untergeordneten Prozess (führt den Befehl/das Skript aus).
- Für den untergeordneten Prozess wird eine neue Prozessgruppe (unter Unix) oder ein Job (unter Windows) erstellt.
- Zabbix liest aus der Pipe, bis ein Timeout auftritt oder niemand mehr an das andere Ende schreibt (ALLE Handles/Dateideskriptoren wurden geschlossen). Beachten Sie, dass der untergeordnete Prozess weitere Prozesse erstellen und beendet werden kann, bevor diese beendet werden oder das Handle/den Dateideskriptor schließen.
- Wenn das Timeout noch nicht erreicht wurde, wartet Zabbix, bis der ursprüngliche untergeordnete Prozess beendet wird oder ein Timeout auftritt.
- Wenn der ursprüngliche untergeordnete Prozess beendet wird, bevor das Timeout erreicht ist, überprüft Zabbix den Exit-Code des ursprünglichen untergeordneten Prozesses und vergleicht ihn mit
0. Ein Exit-Code ungleich null gilt als Ausführungsfehler, jedoch nur für benutzerdefinierte Alarmskripte, Remote-Befehle und Benutzerskripte, die auf dem Zabbix-Server oder dem Zabbix-Proxy ausgeführt werden. - An diesem Punkt wird davon ausgegangen, dass alles abgeschlossen ist und der gesamte Prozessbaum (d. h. die Prozessgruppe oder der Job) beendet wird.
Zabbix geht davon aus, dass ein Befehl/Skript die Verarbeitung abgeschlossen hat, wenn der ursprüngliche untergeordnete Prozess beendet wurde UND kein anderer Prozess das Ausgabe-Handle/den Dateideskriptor weiterhin geöffnet hält. Wenn die Verarbeitung abgeschlossen ist, werden ALLE erstellten Prozesse beendet.
Alle doppelten Anführungszeichen und umgekehrten Schrägstriche im Befehl werden mit umgekehrten Schrägstrichen maskiert, und der Befehl wird in doppelte Anführungszeichen eingeschlossen.
Prüfung des Exit-Codes
Der Exit-Code wird anhand der folgenden Bedingungen geprüft:
- Nur für benutzerdefinierte Alarmskripte, Remote-Befehle und Benutzerskripte, die auf dem Zabbix Server und dem Zabbix Proxy ausgeführt werden.
- Jeder Exit-Code, der von
0abweicht, gilt als Ausführungsfehler. - Der Inhalt der Standardfehlerausgabe und der Standardausgabe fehlgeschlagener Ausführungen wird erfasst und ist im Frontend verfügbar (dort, wo das Ausführungsergebnis angezeigt wird).
- Für Remote-Befehle, die auf dem Zabbix Agent/Proxy ausgeführt werden, kann durch Aktivieren des Parameters LogRemoteCommands auf Agent/Proxy ein zusätzlicher Protokolleintrag erstellt werden.
Mögliche Frontend-Meldungen und Protokolleinträge für fehlgeschlagene Befehle oder Skripte:
- Der Inhalt der Standardfehlerausgabe und der Standardausgabe fehlgeschlagener Ausführungen (falls vorhanden).
Process exited with code: N.(bei leerer Ausgabe und einem Exit-Code ungleich0).Process killed by signal: N.(wenn der Prozess durch ein Signal beendet wurde, nur unter Linux).Process terminated unexpectedly.(wenn der Prozess aus unbekannten Gründen unerwartet beendet wurde).