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.
Tutti i comandi e gli script vengono eseguiti con i permessi dell'utente del sistema operativo che esegue l'agent Zabbix. L'utente deve disporre di autorizzazioni sufficienti per eseguire il comando o lo script.
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 richiamare tale script durante l'esecuzione del comando.
Il comando o lo script viene eseguito in modo analogo sulle piattaforme Unix e 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).
- Per il processo figlio viene creato un nuovo gruppo di processi (in Unix) o un job (in Windows).
- Zabbix legge dalla pipe fino al verificarsi del timeout o finché nessun processo scrive sull'altro lato (TUTTI gli handle/descrittori di file sono stati chiusi). Si noti che il processo figlio può creare altri processi e terminare prima che questi terminino o chiudano l'handle/descrittore di file.
- Se il timeout non è stato raggiunto, Zabbix attende che il processo figlio iniziale termini o che si verifichi il timeout.
- Se il processo figlio iniziale termina prima del raggiungimento del timeout, Zabbix controlla il codice di uscita del processo figlio iniziale e lo confronta con
0. Un codice di uscita diverso da zero viene considerato un errore di esecuzione, ma solo per gli script di avviso personalizzati, i comandi remoti e gli script utente eseguiti sul server Zabbix o sul proxy Zabbix. - A questo punto si presume che tutto sia terminato e che l'intero albero dei processi (ovvero il gruppo di processi o il job) venga terminato.
Zabbix considera completata l'elaborazione di un comando/script quando il processo figlio iniziale è terminato E nessun altro processo mantiene ancora aperto l'handle/descrittore di output. Al termine dell'elaborazione, TUTTI i processi creati vengono terminati.
Tutte le virgolette doppie e le barre rovesciate presenti nel comando vengono precedute da barre rovesciate e il comando viene racchiuso tra virgolette doppie.
Verifica del codice di uscita
Il codice di uscita viene verificato in base alle seguenti condizioni:
- Solo per gli script di avviso personalizzati, i comandi remoti e gli script utente eseguiti sul server Zabbix e sul proxy Zabbix.
- Qualsiasi codice di uscita diverso da
0viene considerato un errore di esecuzione. - Il contenuto dell'errore standard e dell'output standard delle 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 sull'agent/proxy Zabbix abilitando il parametro LogRemoteCommands sull'agent/proxy.
Possibili messaggi nel frontend e voci di log per comandi o script non riusciti:
- Il contenuto dell'errore standard e dell'output standard delle esecuzioni non riuscite (se presente).
Process exited with code: N.(per output vuoto e codice di uscita diverso da0).Process killed by signal: N.(per processi terminati da un segnale, solo su Linux).Process terminated unexpectedly.(per processi terminati per motivi sconosciuti).