Workstation online OnWorks Linux e Windows

Logo

Hosting online gratuito per workstation

<Precedenti | Contenuti | Succ.>

Trappole

Nel capitolo 10 abbiamo visto come i programmi possono rispondere ai segnali. Possiamo aggiungere questa funzionalità anche ai nostri script. Sebbene gli script che abbiamo scritto finora non abbiano avuto bisogno di questa capacità (perché hanno tempi di esecuzione molto brevi e non creano file temporanei), script più grandi e complicati possono trarre vantaggio dall'avere una routine di gestione del segnale.

Quando progettiamo uno script grande e complicato, è importante considerare cosa succede se l'utente si disconnette o spegne il computer mentre lo script è in esecuzione. Quando si verifica un tale evento, verrà inviato un segnale a tutti i processi interessati. A loro volta, i programmi che rappresentano tali processi possono eseguire azioni per garantire una conclusione corretta e ordinata del programma. Diciamo, ad esempio, di aver scritto uno script che ha creato un file temporaneo durante la sua esecuzione. Nel corso di una buona progettazione, lo script dovrebbe eliminare il file quando lo script termina il suo lavoro. Sarebbe anche intelligente fare in modo che lo script cancelli il file se viene ricevuto un segnale che indica che il programma sta per essere terminato prematuramente.

bash fornisce un meccanismo per questo scopo noto come a trappola. Le trap vengono implementate con il comando integrato opportunamente denominato, trappola. trappola utilizza la seguente sintassi:

trappola segnale di argomento [segnale...]

where argomento è una stringa che verrà letta e trattata come un comando e segnale è la specifica di un segnale che attiverà l'esecuzione del comando interpretato.

Qui c'è un semplice esempio:



#! / Bin / bash


# trap-demo: semplice dimostrazione di gestione del segnale

#! / Bin / bash


# trap-demo: semplice dimostrazione di gestione del segnale


trap "echo 'Ti sto ignorando.'" SIGINT SIGTERM for i in {1..5}; fare

echo "Iterazione $i di 5" sleep 5

fatto

trap "echo 'Ti sto ignorando.'" SIGINT SIGTERM for i in {1..5}; fare

echo "Iterazione $i di 5" sleep 5

fatto


Questo script definisce una trap che eseguirà un eco comando ogni volta che viene ricevuto il segnale SIG- INT o SIGTERM mentre lo script è in esecuzione. L'esecuzione del programma si presenta così quando l'utente tenta di fermare lo script premendo Ctrl-c:


[io@linuxbox~]$ demo-trap

Iterazione 1 di 5

Iterazione 2 di 5 Ti sto ignorando. Iterazione 3 di 5 Ti sto ignorando. Iterazione 4 di 5

Iterazione 5 di 5

[io@linuxbox~]$ demo-trap

Iterazione 1 di 5

Iterazione 2 di 5 Ti sto ignorando. Iterazione 3 di 5 Ti sto ignorando. Iterazione 4 di 5

Iterazione 5 di 5


Come si vede, ogni volta che l'utente tenta di interrompere il programma, viene invece stampato il messaggio.

La costruzione di una stringa per formare un'utile sequenza di comandi può essere scomoda, quindi è pratica comune specificare una funzione di shell come comando. In questo esempio, viene specificata una funzione shell separata per ogni segnale da gestire:



#! / Bin / bash

# trap-demo2: dimostrazione semplice di gestione del segnale exit_on_signal_SIGINT () {

echo "Script interrotto." 2>&1 uscita 0

}


uscita_su_segnale_SIGTERM () {

echo "Script terminato." 2>&1 uscita 0

}


trap exit_on_signal_SIGINT SIGINT trap exit_on_signal_SIGTERM SIGTERM

#! / Bin / bash

# trap-demo2: dimostrazione semplice di gestione del segnale exit_on_signal_SIGINT () {

echo "Script interrotto." 2>&1 uscita 0

}


uscita_su_segnale_SIGTERM () {

echo "Script terminato." 2>&1 uscita 0

}


trap exit_on_signal_SIGINT SIGINT trap exit_on_signal_SIGTERM SIGTERM



per i in {1..5}; fare

echo "Iterazione $i di 5" sleep 5

fatto


per i in {1..5}; fare

echo "Iterazione $i di 5" sleep 5

fatto


Questo script ne presenta due trappola comandi, uno per ogni segnale. Ogni trap, a sua volta, specifica una funzione shell da eseguire quando viene ricevuto il particolare segnale. Notare l'inclusione di un exit comando in ciascuna delle funzioni di trattamento del segnale. senza an exit, lo script continuerà dopo aver completato la funzione.

Quando l'utente preme Ctrl-c durante l'esecuzione di questo script, i risultati sono simili a questo:



[io@linuxbox~]$ trappola-demo2

Iterazione 1 di 5

Iterazione 2 di 5 Script interrotto.

[io@linuxbox~]$ trappola-demo2

Iterazione 1 di 5

Iterazione 2 di 5 Script interrotto.


Immagine

File temporanei

Uno dei motivi per cui i gestori di segnale sono inclusi negli script è la rimozione dei file temporanei che lo script può creare per contenere i risultati intermedi durante l'esecuzione. C'è una sorta di arte nel nominare i file temporanei. Tradizionalmente, i programmi su sistemi Unix-like creano i loro file temporanei nel / Tmp directory, una directory condivisa destinata a tali file. Tuttavia, poiché la directory è condivisa, ciò pone alcuni problemi di sicurezza, in particolare per i programmi in esecuzione con privilegi di superutente. A parte l'ovvio passaggio di impostare le autorizzazioni appropriate per i file esposti a tutti gli utenti del sistema, è importante assegnare ai file temporanei nomi di file non prevedibili. Questo evita un exploit noto come a attacco di corsa temporanea. Un modo per creare un nome non prevedibile (ma comunque descrittivo) è fare qualcosa del genere:

tempfile=/tmp/$(nomebase $0).$$.$RANDOM

Questo creerà un nome file composto dal nome del programma, seguito dal suo ID di processo (PID), seguito da un numero intero casuale. Si noti, tuttavia, che $RAN-DOM shell variabile restituisce solo un valore nell'intervallo 1-32767, che non è un intervallo molto ampio in termini informatici, quindi una singola istanza della variabile non è sufficiente per superare un determinato aggressore.



Immagine

Un modo migliore è usare il mktemp programma (da non confondere con il mktemp funzione di libreria standard) per denominare e creare il file temporaneo. Il mk temp Il programma accetta un modello come argomento utilizzato per creare il nome del file. Il modello dovrebbe includere una serie di caratteri "X", che vengono sostituiti da un numero corrispondente di lettere e numeri casuali. Più lunga è la serie di caratteri "X", più lunga è la serie di caratteri casuali. Ecco un esempio:

filetemp=$(mktemp /tmp/foobar.$$.XXXXXXXXXX)

Questo crea un file temporaneo e assegna il suo nome alla variabile filetemp. I caratteri "X" nel modello vengono sostituiti con lettere e numeri casuali in modo che il nome del file finale (che, in questo esempio, include anche il valore espanso del parametro speciale $$ per ottenere il PID) potrebbe essere qualcosa del tipo:

/tmp/foobar.6593.UOZuvM6654

Per gli script eseguiti da utenti regolari, potrebbe essere saggio evitare l'uso di / Tmp directory e creare una directory per i file temporanei all'interno della home directory dell'utente, con una riga di codice come questa:

[[ -d $HOME/tmp ]] || mkdir$HOME/tmp


Il miglior sistema operativo cloud computing su OnWorks: