Exécution de commandes
Zabbix utilise une fonctionnalité commune 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 globaux.
Toutes les commandes et tous les scripts sont exécutés avec les permissions de l'utilisateur du système d'exploitation qui exécute l'agent Zabbix. L'utilisateur doit disposer des permissions suffisantes pour exécuter la commande ou le script.
Étapes d’exécution
Par défaut, tous les scripts dans Zabbix sont exécutés à l’aide du shell sh, et il n’est pas possible de modifier le shell par défaut. Pour utiliser un autre shell, vous pouvez appliquer une solution de contournement : créer un fichier de script et appeler ce script lors de l’exécution de la commande.
La commande ou le script est exécuté de manière similaire sur les plateformes Unix et Windows :
- Zabbix (le processus parent) crée un canal pour la communication.
- Zabbix définit le canal comme sortie du processus enfant qui sera créé.
- Zabbix crée le processus enfant (exécute la commande/le script).
- Un nouveau groupe de processus (sous Unix) ou un travail (sous Windows) est créé pour le processus enfant.
- Zabbix lit le canal jusqu’à l’expiration du délai d’attente ou jusqu’à ce que plus aucun processus n’écrive à l’autre extrémité (TOUS les handles/descripteurs de fichier ont été fermés). Notez que le processus enfant peut créer d’autres processus et se terminer avant que ceux-ci ne se terminent 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 expire.
- Si le processus enfant initial se termine avant l’expiration du délai d’attente, Zabbix vérifie le code de sortie du processus enfant initial et le compare à
0. Un code de sortie différent de zéro est considéré comme un échec d’exécution, mais uniquement pour les scripts d’alerte personnalisés, les commandes distantes et les scripts utilisateur exécutés sur le serveur Zabbix ou le proxy Zabbix. - À ce stade, il est supposé que tout est terminé et l’ensemble de l’arborescence des processus (c’est-à-dire le groupe de processus ou le travail) est arrêté.
Zabbix considère qu’une commande/un script a terminé son traitement lorsque le processus enfant initial s’est terminé ET qu’aucun autre processus ne maintient ouvert le handle/descripteur de fichier de sortie. Une fois le traitement terminé, TOUS les processus créés sont arrêtés.
Tous les guillemets doubles et les barres obliques inverses de la commande sont échappés à l’aide de barres obliques inverses, et la commande est placée entre guillemets doubles.
Vérification du code de sortie
Le code de sortie est vérifié 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
0est considéré comme un échec d’exécution. - Le contenu de la sortie d’erreur standard et de la sortie standard des exécutions ayant échoué est collecté et disponible dans l’interface (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 Zabbix/le proxy en activant le paramètre LogRemoteCommands sur agent/proxy.
Messages possibles dans l’interface et entrées de journal pour les commandes ou scripts ayant échoué :
- Contenu de la sortie d’erreur standard et de la sortie standard des exécutions ayant échoué (le cas échéant).
Process exited with code: N.(pour une sortie vide et un code de sortie différent de0).Process killed by signal: N.(pour un processus terminé par un signal, sous Linux uniquement).Process terminated unexpectedly.(pour un processus terminé pour une raison inconnue).