Trap is a simple, but very useful utility. If your script creates temporary files, such as this simple script which replaces FOO for BAR in all files in the current directory, /tmp is clean when the script exits. If it gets interrupted partway through, though, there could be a file lying around in /tmp:
#!/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 doneThe
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 doneThe above script is quite fun - it catches a CTRL-C, doesn't exit, but just changes how it's running. How this could be useful for positive and negative effect is left as an exercise to the reader:) This particular example concedes to quit after 4 interrupts (or 2000 seconds). Note that anything will be killed by a
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 trapped) |
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.
My Shell Scripting books, available in Paperback and eBook formats. This tutorial is more of a general introduction to Shell Scripting, the longer Shell Scripting: Expert Recipes for Linux, Bash and more book covers every aspect of Bash in detail.
Shell Scripting Tutorial is this tutorial, in 88-page Paperback and eBook formats. Convenient to read on the go, and in paperback format good to keep by your desk as an ever-present companion. Also available in PDF form from Gumroad:Get this tutorial as a PDF | Shell Scripting: Expert Recipes for Linux, Bash and more is my 564-page book on Shell Scripting. The first half covers all of the features of the shell in every detail; the second half has real-world shell scripts, organised by topic, along with detailed discussion of each script. |