2012-02-13 7 views

risposta

35

(Se avete solo il numero di un segnale e desidera che il nome, kill -l $SIGNAL_NUM stampa il nome di un segnale, è possibile evitare che utilizzando i nomi al posto dei numeri di segnale nella chiamata a trap come qui di seguito.)

This answer afferma che l'unico modo per identificare quale segnale è intrappolato in bash è scrivere un wrapper separato per ogni segnale diverso che si desidera intercettare. Another answer on that same question fornisce una funzione wrapper per farlo per voi:

Codice:

#!/bin/bash 

trap_with_arg() { 
    func="$1" ; shift 
    for sig ; do 
     trap "$func $sig" "$sig" 
    done 
} 

func_trap() { 
    echo Trapped: $1 
} 

trap_with_arg func_trap INT TERM EXIT 

read # Wait so the script doesn't exit. 

Se corro che, allora posso inviare segnali al processo e ottengo output come

Trapped: INT 
Trapped: TERM 
Trapped: EXIT 
+0

Grazie. Ma non funzionerà per me. Quella funzione trap_with_arg() si bloccherà fino a quando non viene ricevuto il segnale. Voglio che il nome del segnale venga visualizzato quando viene ricevuto un segnale - mentre lo script è in esecuzione. Nel mio caso non sto aspettando il segnale. Ogni volta che arriva, deve essere stampato. –

+8

'trap_with_arg()' non blocca. Passa attraverso il suo input, imposta i gestori di trap e quindi ritorna. – perelman

+0

Lunar Mushrooms, potrebbe sembrare di bloccare perché i trap non vengono elaborati mentre i comandi del tuo script sono in esecuzione. Se hai segnalato il tuo script mentre si trovava nel mezzo di un "sonno", non eseguiva la trappola fino a quando il "sonno" non era completo. Non è asincrono. La trappola catturerà i segnali tra i comandi del tuo script. – Ray

6

Entro la trappola (quando viene attivata tramite un segnale), il $? variabile è inizialmente impostata sul numero di segnale, più 128, in modo da poter assegnare il numero di segnale da una variabile, rendendo la prima dichiarazione dell'azione trappola a qualcosa come

sig=$(($? - 128)) 

È quindi possibile ottenere il nome del segnale utilizzando il comando kill

kill -l $sig 
+1

Sarebbe stato bello, ma non funziona per me su Linux 3.10 con Bash 4.3.30: '$?' È 0 all'inizio del gestore di segnale, anche se è stato richiamato dal segnale 'TERM'. –

+0

Questa sembra la migliore risposta dal momento che è più semplice. – codeforester

1

un modo semplice per fare questo:

_handler() { 
    signal=$1 
    echo signal was $signal 
} 

trap '_handler SIGTERM' SIGTERM 
trap '_handler SIGINT' SIGINT 
Problemi correlati