#!/bin/sh trap cleanup 1 2 3 6 cleanup() { echo "Caught Signal ... cleaning up." rm -rf /tmp/temp_*.$$ echo "Done cleanup ... quitting." exit 1 } ### main script for i in * do sed s/FOO/BAR/g $i > /tmp/temp_${i}.$$ && mv /tmp/temp_${i}.$$ $i done
trap
statement tells the script to run cleanup()
on signals 1, 2, 3 or 6.
The most common one (CTRL-C) is signal 2 (SIGINT). This can also be used for quite interesting purposes:
#!/bin/sh trap 'increment' 2 increment() { echo "Caught SIGINT ..." X=`expr ${X} + 500` if [ "${X}" -gt "2000" ] then echo "Okay, I'll quit ..." exit 1 fi } ### main script X=0 while : do echo "X=$X" X=`expr ${X} + 1` sleep 1 done
kill -9 <PID>
without getting the chance to process it.
Here is a table of some of the common interrupts:
Number | SIG | Meaning |
---|---|---|
0 | 0 | On exit from shell |
1 | SIGHUP | Clean tidyup |
2 | SIGINT | Interrupt |
3 | SIGQUIT | Quit |
6 | SIGABRT | Abort |
9 | SIGKILL | Die Now (cannot be trap'ped) |
14 | SIGALRM | Alarm Clock |
15 | SIGTERM | Terminate |
Note that if your script was started in an environment which itself was ignoring signals (for example, under
nohup
control), the script will also ignore those signals.