9 Exécution de commande
Zabbix utilise des fonctionnalités communes pour les vérifications externes, les paramètres utilisateur, les éléments system.run, les scripts d'alerte personnalisés, les commandes à distance et les scripts utilisateur.
Étapes d'exécution
Par défaut, tous les scripts dans Zabbix sont exécutés à l'aide du shell sh, il n'est pas possible de modifier le shell par défaut. Pour utiliser un autre shell, vous pouvez utiliser une solution de contournement : créez un fichier script et appelez ce script pendant l'exécution de la commande.
La commande/le script est exécuté de la même manière sur les plates-formes Unix et Windows :
- Zabbix (le processus parent) crée un canal pour la communication
- Zabbix définit le canal comme sortie pour le processus enfant à créer
- Zabbix crée le processus enfant (exécute la commande/le script)
- Un nouveau groupe de processus (sous Unix) ou une tâche (sous Windows) est créé pour le processus enfant
- Zabbix lit à partir du canal jusqu'à ce que le délai d'attente se produise ou que personne n'écrive à l'autre extrémité (TOUS les handles/descripteurs de fichiers ont été fermés). Notez que le processus enfant peut créer plus de processus et quitter avant qu'ils ne quittent ou ne ferment le handle/descripteur de fichier.
- Si le délai d'attente n'a pas été atteint, Zabbix attend que le processus enfant initial se termine ou que le délai d'attente se produise
- Si le processus enfant initial s'est terminé et que le délai d'attente n'a pas été atteint, Zabbix vérifie le code de sortie du processus enfant initial et le compare à 0 (une valeur différente de zéro est considérée comme un échec d'exécution, uniquement pour les scripts d'alerte personnalisés, les commandes distantes et les scripts utilisateur exécutés sur le serveur Zabbix et le proxy Zabbix)
- À ce stade, il est supposé que tout est terminé et que l'ensemble de l'arborescence des processus (c'est-à-dire le groupe de processus ou le travail) est terminé
Zabbix suppose qu'une commande/un script a terminé le traitement lorsque le processus enfant initial est terminé ET qu'aucun autre processus ne maintient toujours le handle/descripteur de fichier de sortie ouvert. Lorsque le traitement est terminé, TOUS les processus créés sont terminés.
Tous les guillemets doubles et les barres obliques inverses de la commande sont échappés avec des barres obliques inverses et la commande est entourée de guillemets doubles.
Vérification du code de sortie
Les codes de sortie sont vérifiés selon les conditions suivantes :
- Uniquement pour les scripts d’alerte personnalisés, les commandes distantes et les scripts utilisateur exécutés sur le serveur Zabbix et le proxy Zabbix.
- Tout code de sortie différent de 0 est considéré comme un échec d’exécution.
- Le contenu de la sortie d’erreur standard et de la sortie standard pour les exécutions ayant échoué est collecté et disponible dans le frontend (où le résultat de l’exécution est affiché).
- Une entrée de journal supplémentaire peut être créée pour les commandes distantes exécutées sur l’agent/proxy Zabbix en activant le paramètre LogRemoteCommands sur agent/proxy.
Messages du frontend et entrées de journal possibles pour les commandes/scripts ayant échoué :
- Contenu de la sortie d’erreur standard et de la sortie standard pour les exécutions ayant échoué (le cas échéant).
- "Le processus s’est terminé avec le code : N." (pour une sortie vide et un code de sortie différent de 0).
- "Le processus a été arrêté par le signal : N." (pour un processus terminé par un signal, sous Linux uniquement).
- "Le processus s’est terminé de manière inattendue." (pour un processus terminé pour des raisons inconnues).