Ejecución de comandos
Zabbix utiliza una funcionalidad común para las comprobaciones externas, los parámetros de usuario, los items system.run, los scripts de alerta personalizados, los comandos remotos y los scripts globales.
Todos los comandos y scripts se ejecutan con los permisos del usuario del sistema operativo que ejecuta el agent. El usuario debe tener permisos suficientes para ejecutar el comando o script.
Pasos de ejecución
De forma predeterminada, todos los scripts en Zabbix se ejecutan mediante el shell sh y no es posible modificar el shell predeterminado. Para utilizar otro shell, puede emplear una solución alternativa: crear un archivo de script e invocar ese script durante la ejecución del comando.
El comando o script se ejecuta de forma similar en las plataformas Unix y Windows:
- Zabbix (el proceso principal) crea una tubería para la comunicación.
- Zabbix establece la tubería como salida del proceso secundario que se va a crear.
- Zabbix crea el proceso secundario (ejecuta el comando/script).
- Se crea un nuevo grupo de procesos (en Unix) o un trabajo (en Windows) para el proceso secundario.
- Zabbix lee de la tubería hasta que se produce un tiempo de espera o hasta que nadie escribe en el otro extremo (TODOS los identificadores/descriptores de archivo se han cerrado). Tenga en cuenta que el proceso secundario puede crear más procesos y finalizar antes de que estos finalicen o cierren el identificador/descriptor de archivo.
- Si no se ha alcanzado el tiempo de espera, Zabbix espera hasta que el proceso secundario inicial finalice o se produzca un tiempo de espera.
- Si el proceso secundario inicial finaliza antes de que se alcance el tiempo de espera, Zabbix comprueba el código de salida del proceso secundario inicial y lo compara con
0. Un código de salida distinto de cero se considera un error de ejecución, pero solo para scripts de alerta personalizados, comandos remotos y scripts de usuario ejecutados en el Zabbix server o el Zabbix proxy. - En este punto se supone que todo ha terminado y que se finaliza todo el árbol de procesos (es decir, el grupo de procesos o el trabajo).
Zabbix supone que un comando/script ha terminado de procesarse cuando el proceso secundario inicial ha finalizado Y ningún otro proceso mantiene abierto el identificador/descriptor de archivo de salida. Cuando finaliza el procesamiento, se terminan TODOS los procesos creados.
Todas las comillas dobles y barras invertidas del comando se escapan con barras invertidas y el comando se encierra entre comillas dobles.
Comprobación del código de salida
Los códigos de salida se comprueban con las siguientes condiciones:
- Solo para scripts de alerta personalizados, comandos remotos y scripts de usuario ejecutados en Zabbix server y Zabbix proxy.
- Cualquier código de salida diferente de
0se considera un error de ejecución. - El contenido de la salida de error estándar y de la salida estándar de las ejecuciones fallidas se recopila y está disponible en el frontend (donde se muestra el resultado de la ejecución).
- Se puede crear una entrada de registro adicional para los comandos remotos ejecutados en Zabbix agent/proxy habilitando el parámetro LogRemoteCommands en agent/proxy.
Posibles mensajes del frontend y entradas de registro para comandos o scripts fallidos:
- Contenido de la salida de error estándar y de la salida estándar de las ejecuciones fallidas (si existe).
Process exited with code: N.(para una salida vacía y un código de salida diferente de0).Process killed by signal: N.(para un proceso terminado por una señal, solo en Linux).Process terminated unexpectedly.(para un proceso terminado por motivos desconocidos).