Natürlich können Shellscripts auch auf Signale reagieren. Mit dem Befehl trap können bestimmte Signale mit bestimmten Befehlen verbunden werden. Jedesmal, wenn das Script ein bestimmtes Signal auffängt, wird dann der entsprechende Befehl ausgeführt.

trap "Befehl1; Befehl2;..." Signalliste

Um bestimmte Signale ganz zu ignorieren, etwa die Signale zum Programmabbruch (0,1,2,3,15) kann trap einfach mit einer leeren Anweisung diese Signale abfangen:

trap "" 0 1 2 3 15

Beispiel:

Wir schreiben ein Script, das von 0 bis 65535 zählt, damit das nicht zu schnell geht warten wir nach jeder Zahl eine Sekunde. Das würde dann ungefähr so aussehen:

#!/bin/bash
i=0
while [ i -le 65535 ]
do
  echo $i
  let i=$i+1
  sleep 1
done

Jetzt modifizieren wir das Programm so, dass es jedesmal, wenn es das Signal USR1 (10) bekommt, wieder von vorne anfängt.

#!/bin/bash
trap "i=0" 10
i=0
while [ i -le 65535 ]
do
  echo $i
  let i=$i+1
  sleep 1
done     

Wenn wir dieses Script jetzt laufen lassen und von einem anderen Terminal aus, dem laufenden Script mit

kill -10 PID

das Signal 10 schicken, wird dieses Signal vom trap-Befehl abgefangen und der Befehl i=0 ausgeführt. Der Effekt ist sofort sichtbar, unser Programm fängt wieder von vorne zu zählen an.

Will man wissen, welche Lesefunktionen Trap besitzt ruft man trap mit der Option l auf:

trap -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
    

Schreibe einen Kommentar