9 Ejecución de comandos

Zabbix utiliza una funcionalidad común para comprobaciones externas, parámetros de usuario, métricas system.run, scripts de alerta personalizados, comandos remotos y scripts globales.

Pasos de ejecución

Por defecto, todos los scripts en Zabbix se ejecutan utilizando el intérprete de comandos sh, y no es posible modificar el intérprete por defecto. Para utilizar un intérprete diferente, puede emplear una solución alternativa: cree un archivo de script e invoque ese script durante la ejecución del comando.

El comando/script se ejecuta de manera similar tanto en plataformas Unix como en Windows:

  1. Zabbix (el proceso padre) crea un pipe para la comunicación
  2. Zabbix establece el pipe como la salida para el proceso hijo que se va a crear
  3. Zabbix crea el proceso hijo (ejecuta el comando/script)
  4. Se crea un nuevo grupo de procesos (en Unix) o un trabajo (en Windows) para el proceso hijo
  5. Zabbix lee del pipe hasta que ocurre un timeout o nadie esté escribiendo en el otro extremo (TODOS los manejadores/descriptores de archivo han sido cerrados). Tenga en cuenta que el proceso hijo puede crear más procesos y salir antes de que estos salgan o cierren el manejador/descriptor de archivo.
  6. Si no se ha alcanzado el timeout, Zabbix espera hasta que el proceso hijo inicial salga o ocurra el timeout
  7. Si el proceso hijo inicial salió y no se ha alcanzado el timeout, Zabbix verifica el código de salida del proceso hijo inicial y lo compara con 0 (un valor distinto de cero se considera como fallo de ejecución, solo para scripts de alerta personalizados, comandos remotos y scripts de usuario ejecutados en el servidor Zabbix y el proxy Zabbix)
  8. En este punto se asume que todo ha finalizado y todo el árbol de procesos (es decir, el grupo de procesos o el trabajo) se termina

Zabbix asume que un comando/script ha finalizado el procesamiento cuando el proceso hijo inicial ha salido Y ningún otro proceso sigue manteniendo abierto el manejador/descriptor de salida. Cuando el procesamiento ha finalizado, TODOS los procesos creados se terminan.

Todas las comillas dobles y las barras invertidas en el comando se escapan con barras invertidas y el comando se encierra entre comillas dobles.

Verificación del código de salida

Los códigos de salida se verifican 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 distinto de 0 se considera un fallo de ejecución.
  • El contenido de la salida de error estándar y de la salida estándar para las ejecuciones fallidas se recopila y está disponible en frontend (donde se muestra el resultado de la ejecución).
  • Se puede crear una entrada adicional en el registro para comandos remotos ejecutados en Zabbix agent/proxy habilitando el parámetro LogRemoteCommands en agent/proxy.

Posibles mensajes de frontend y entradas de registro para comandos/scripts fallidos:

  • El contenido de la salida de error estándar y de la salida estándar para las ejecuciones fallidas (si lo hay).
  • "Process exited with code: N." (para salida vacía y código de salida no igual a 0).
  • "Process killed by signal: N." (para un proceso terminado por una señal, solo en Linux).
  • "Process terminated unexpectedly." (para un proceso terminado por razones desconocidas).

Véase también