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:

  1. Zabbix (el proceso principal) crea una tubería para la comunicación.
  2. Zabbix establece la tubería como salida del proceso secundario que se va a crear.
  3. Zabbix crea el proceso secundario (ejecuta el comando/script).
  4. Se crea un nuevo grupo de procesos (en Unix) o un trabajo (en Windows) para el proceso secundario.
  5. 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.
  6. 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.
  7. 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.
  8. 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 0 se 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 de 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 motivos desconocidos).

Véase también