Jun 192013
 

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 [OPZIONI] DURATA COMANDO [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:

flattr this!

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>