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:
- O Zabbix (o processo pai) cria um pipe para comunicação.
- O Zabbix define o pipe como a saída do processo filho a ser criado.
- O Zabbix cria o processo filho (executa o comando/script).
- Um novo grupo de processos (no Unix) ou um job (no Windows) é criado para o processo filho.
- 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.
- Se o timeout ainda não tiver sido atingido, o Zabbix aguarda até que o processo filho inicial seja encerrado ou ocorra um timeout.
- 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. - 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 de0).Process killed by signal: N.(para processos encerrados por um sinal, somente no Linux).Process terminated unexpectedly.(para processos encerrados por motivos desconhecidos).