9 Befehlsausführung

Zabbix verwendet gemeinsame Funktionalität für externe Prüfungen, Benutzerparameter, system.run-Datenpunkte, benutzerdefinierte Alarmierungsskripte, Remote-Befehle und globale Skripte.

Ausführungsschritte

Standardmäßig werden alle Skripte in Zabbix mit der sh-Shell ausgeführt, und es ist nicht möglich, die Standard-Shell zu ändern. Um eine andere Shell zu verwenden, können Sie einen Workaround nutzen: Erstellen Sie eine Skriptdatei und rufen Sie dieses Skript bei der Befehlsausführung auf.

Der Befehl/das Skript wird auf Unix- und Windows- Plattformen auf ähnliche Weise ausgeführt:

  1. Zabbix (der übergeordnete Prozess) erstellt eine Pipe für die Kommunikation
  2. Zabbix setzt die Pipe als Ausgabe für den zu erstellenden Child- Prozess
  3. Zabbix erstellt den Child-Prozess (führt den Befehl/das Skript aus)
  4. Für den Child-Prozess wird eine neue Prozessgruppe (unter Unix) bzw. ein Job (unter Windows) erstellt
  5. Zabbix liest aus der Pipe, bis ein Timeout eintritt oder niemand mehr auf das andere Ende schreibt (ALLE Handles/Dateideskriptoren wurden geschlossen). Beachten Sie, dass der Child-Prozess weitere Prozesse erstellen und beendet werden kann, bevor diese beendet werden oder den Handle/Dateideskriptor schließen.
  6. Wenn das Timeout noch nicht erreicht wurde, wartet Zabbix, bis der ursprüngliche Child-Prozess beendet wird oder ein Timeout eintritt
  7. Wenn der ursprüngliche Child-Prozess beendet wurde und das Timeout noch nicht erreicht wurde, prüft Zabbix den Exit-Code des ursprünglichen Child-Prozesses und vergleicht ihn mit 0 (ein Wert ungleich null wird als Ausführungsfehler betrachtet, nur für benutzerdefinierte Alarmierungsskripte, Remote-Befehle und Benutzerskripte, die auf Zabbix Server und Zabbix Proxy ausgeführt werden)
  8. An diesem Punkt wird angenommen, 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 Child-Prozess beendet wurde UND kein anderer Prozess den Ausgabe-Handle/Dateideskriptor noch offen hält. Wenn die Verarbeitung abgeschlossen ist, werden ALLE erstellten Prozesse beendet.

Alle doppelten Anführungszeichen und Backslashes im Befehl werden mit Backslashes maskiert, und der Befehl wird in doppelte Anführungszeichen eingeschlossen.

Prüfung des Exit-Codes

Exit-Codes werden unter den folgenden Bedingungen geprüft:

  • Nur für benutzerdefinierte Alarmierungsskripte, Remote-Befehle und Benutzerskripte, die auf Zabbix Server und Zabbix Proxy ausgeführt werden.
  • Jeder Exit-Code, der sich von 0 unterscheidet, wird als Ausführungsfehler betrachtet.
  • Inhalte von Standard Error und Standard Output bei fehlgeschlagenen Ausführungen werden gesammelt und sind im Frontend verfügbar (wo das Ausführungsergebnis angezeigt wird).
  • Ein zusätzlicher Log-Eintrag kann für Remote-Befehle erstellt werden, die auf Zabbix Agent/Proxy ausgeführt werden, indem der Parameter LogRemoteCommands auf agent/proxy aktiviert wird.

Mögliche Frontend-Meldungen und Log-Einträge für fehlgeschlagene Befehle/Skripte:

  • Inhalte von Standard Error und Standard Output bei fehlgeschlagenen Ausführungen (falls vorhanden).
  • "Process exited with code: N." (bei leerer Ausgabe und einem Exit-Code ungleich 0).
  • "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 beendet wurde).

Siehe auch