9 Esecuzione dei comandi
Zabbix utilizza funzionalità comuni per i controlli esterni, i parametri utente, gli item system.run, gli script di avviso personalizzati, i comandi remoti e gli script globali.
Fasi di esecuzione
Per impostazione predefinita, tutti gli script in Zabbix vengono eseguiti utilizzando la shell sh, e non è possibile modificare la shell predefinita. Per utilizzare una shell diversa, è possibile adottare una soluzione alternativa: creare un file di script e richiamarlo durante l'esecuzione del comando.
Il comando/script viene eseguito in modo simile sia sulle piattaforme Unix che Windows:
- Zabbix (il processo padre) crea una pipe per la comunicazione
- Zabbix imposta la pipe come output per il processo figlio da creare
- Zabbix crea il processo figlio (esegue il comando/script)
- Viene creato un nuovo gruppo di processi (in Unix) o un job (in Windows) per il processo figlio
- Zabbix legge dalla pipe finché non si verifica il timeout oppure finché nessuno scrive più all'altra estremità (TUTTI gli handle/file descriptor sono stati chiusi). Si noti che il processo figlio può creare altri processi e terminare prima che questi terminino o chiudano l'handle/file descriptor.
- Se il timeout non è stato raggiunto, Zabbix attende finché il processo figlio iniziale non termina oppure finché non si verifica il timeout
- Se il processo figlio iniziale è terminato e il timeout non è stato raggiunto, Zabbix controlla il codice di uscita del processo figlio iniziale e lo confronta con 0 (un valore diverso da zero è considerato un errore di esecuzione, solo per gli script di avviso personalizzati, i comandi remoti e gli script utente eseguiti su Zabbix server e Zabbix proxy)
- A questo punto si presume che tutto sia stato completato e l'intero albero dei processi (cioè il gruppo di processi o il job) viene terminato
Zabbix presume che un comando/script abbia completato l'elaborazione quando il processo figlio iniziale è terminato E nessun altro processo mantiene ancora aperto l'handle/file descriptor di output. Quando l'elaborazione è completata, TUTTI i processi creati vengono terminati.
Tutte le virgolette doppie e le barre rovesciate nel comando vengono precedute da una barra rovesciata di escape e il comando viene racchiuso tra virgolette doppie.
Controllo del codice di uscita
I codici di uscita vengono controllati secondo le seguenti condizioni:
- Solo per script di avviso personalizzati, comandi remoti e script utente eseguiti su Zabbix server e Zabbix proxy.
- Qualsiasi codice di uscita diverso da 0 è considerato un errore di esecuzione.
- Il contenuto dell'errore standard e dell'output standard per le esecuzioni non riuscite viene raccolto ed è disponibile nel frontend (dove viene visualizzato il risultato dell'esecuzione).
- È possibile creare una voce di log aggiuntiva per i comandi remoti eseguiti su Zabbix agent/proxy abilitando il parametro LogRemoteCommands su agent/proxy.
Possibili messaggi nel frontend e voci di log per comandi/script non riusciti:
- Contenuto dell'errore standard e dell'output standard per le esecuzioni non riuscite (se presente).
- "Il processo è terminato con il codice: N." (per output vuoto e codice di uscita diverso da 0).
- "Il processo è stato terminato dal segnale: N." (per processi terminati da un segnale, solo su Linux).
- "Il processo è terminato in modo imprevisto." (per processi terminati per motivi sconosciuti).