Execução de comandos

O Zabbix usa uma funcionalidade comum para verificações externas, parâmetros de usuário, itens system.run, scripts de alerta personalizados, comandos remotos e scripts globais.

Todos os comandos e scripts são executados com as permissões do usuário do sistema operacional que executa o agent. O usuário deve ter permissões suficientes para executar o comando ou script.

Etapas de execução

Por padrão, todos os scripts no Zabbix são executados usando o shell sh, e não é possível modificar o shell padrão. Para utilizar um shell diferente, você pode usar uma solução alternativa: criar um arquivo de script e invocar esse script durante a execução do comando.

O comando ou script é executado de forma semelhante nas plataformas Unix e Windows:

  1. O Zabbix (o processo pai) cria um pipe para comunicação.
  2. O Zabbix define o pipe como a saída do processo filho a ser criado.
  3. O Zabbix cria o processo filho (executa o comando/script).
  4. Um novo grupo de processos (no Unix) ou um job (no Windows) é criado para o processo filho.
  5. O Zabbix lê do pipe até ocorrer um timeout ou até que ninguém esteja escrevendo na outra extremidade (TODOS os handles/descritores de arquivo tenham sido fechados). Observe que o processo filho pode criar outros processos e ser encerrado antes que eles sejam encerrados ou fechem o handle/descritor de arquivo.
  6. Se o timeout ainda não tiver sido atingido, o Zabbix aguarda até que o processo filho inicial seja encerrado ou ocorra um timeout.
  7. Se o processo filho inicial for encerrado antes que o timeout seja atingido, o Zabbix verifica o código de saída do processo filho inicial e o compara com 0. Um código de saída diferente de zero é considerado uma falha de execução, mas somente para scripts de alerta personalizados, comandos remotos e scripts de usuário executados no Zabbix server ou no Zabbix proxy.
  8. Neste ponto, considera-se que tudo foi concluído e toda a árvore de processos (ou seja, o grupo de processos ou o job) é encerrada.

O Zabbix considera que um comando/script concluiu o processamento quando o processo filho inicial foi encerrado E nenhum outro processo ainda mantém o handle/descritor de arquivo de saída aberto. Quando o processamento é concluído, TODOS os processos criados são encerrados.

Todas as aspas duplas e barras invertidas no comando são escapadas com barras invertidas, e o comando é colocado entre aspas duplas.

Verificação do código de saída

Os códigos de saída são verificados de acordo com as seguintes condições:

  • Somente para scripts de alerta personalizados, comandos remotos e scripts de usuário executados no Zabbix server e no Zabbix proxy.
  • Qualquer código de saída diferente de 0 é considerado uma falha de execução.
  • O conteúdo da saída de erro padrão e da saída padrão das execuções com falha é coletado e fica disponível no frontend (onde o resultado da execução é exibido).
  • Uma entrada adicional no log pode ser criada para comandos remotos executados no Zabbix agent/proxy ativando o parâmetro LogRemoteCommands no agent/proxy.

Possíveis mensagens no frontend e entradas no log para comandos ou scripts com falha:

  • Conteúdo da saída de erro padrão e da saída padrão das execuções com falha (se houver).
  • Process exited with code: N. (para saída vazia e código de saída diferente de 0).
  • Process killed by signal: N. (para processos encerrados por um sinal, somente no Linux).
  • Process terminated unexpectedly. (para processos encerrados por motivos desconhecidos).

Veja também