A volte è utile scrivere uno script bash che esegue un qualcosa di simile a “fai questo lavoro, se è ancora in esecuzione dopo XX secondi uccidilo”, come implementarlo in un normale ambiente bash ?
Niente di più semplice: si può utilizzare il comando di shell timeout
per raggiungere questo obiettivo.
Dalla sua pagina di informazioni:
timeout esegue il comando dato e lo uccide se è ancora in esecuzione dopo l’intervallo di tempo specificato
Vediamo come usarlo.
Installazione
Se si dispone di un sistema abbastanza recente si dovrebbe avere il comando timeout
, che fa parte del pacchetto coreutils, di sicuro non è presente su CentOS 5/Rhel 5, quindi se si sta ancora utilizzando queste distribuzioni o un altra “vecchia” distribuzione, passare alla seconda parte di questo articolo “Cosa fare se non si ha il comando timeout”
Uso Base
L’uso base di questo comando è:
timeout [OPTION] DURATION COMMAND [ARG] |
timeout
eseguirà COMANDO (con i suoi ARG) e se è ancora in vita dopo DURATA gli manderà un segnale TERM.
OPZIONI possono essere:
-k DURATA, –kill-after=DURATA:
Si assicura che il COMANDO sia anche ucciso mandandogli un segnale `KILL’ dopo che DURATA specificata. Senza questa opzione, se il segnale selezionato non è stato fatale, `timeout` non uccide il comando.
-s SEGNALE, –signal=SEGNALE:
Manda questo SEGNALE al COMANDO quando avviene il timeout, invece del segnale di default `TERM’. Il SEGNALE può essere un nome come `HUP’ o un numero.
DURATA è un numero in virgola mobile seguito da una unità (opzionale):
`s’ per secondi (il default)
`m’ per minuti
`h’ per ore
`d’ per giorni
Una durata di 0 disattiva il timeout associato
Esempio:
Questo è un semplice esempio che stampa la data, esegue il comando sleep
per 10 secondi, ma con un timeout di 1 secondo e poi esegue il comando date
di nuovo:
date; timeout 1 sleep 10; date Wed Jun 19 23:04:31 CEST 2013 Wed Jun 19 23:04:32 CEST 2013 |
Questa semplice output mostra che il sistema va in “sleep” per solo 1 secondo e non 10.
Altri esempi possono essere visti nel seguente video:
Cosa fare se non si ha il comando timeout
La migliore alternativa che ho trovato al momento è lo script bash pubblicato a questo link: http://www.bashcookbook.com/bashinfo/source/bash-4.0/examples/scripts/timeout3
Questo script Bash shell esegue un comando con un time-out. Una volta raggiunta la scadenza time-out viene inviato un SIGTERM (15) al processo. Se il segnale
rimane bloccato, un successivo SIGKILL (9) termina il processo.
Questo dovrebbe funzionare su qualsiasi distribuzione Linux con Bash.
Popular Posts:
- None Found
Hi,
Can you please give example which uses -s Signal feature of timeout command.
I am not able to find any.
Hi Akash,
You can use -s Signal feature of timeout command like this.
timeout -s, –signal=SIGNAL
specify the signal to be sent on timeout.
SIGNAL may be a name like ‘HUP’ or a number. See ‘kill -l’ for a list of signals
Hope that would suffice.
Regards,
Noufal
errorlogz.com
Please remove the coma ..
timeout -s –signal=SIGNAL