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