| My new 564-page book, Shell Scripting, published by Wiley, is on sale now. Please click "Like" on the left if you are on Facebook, or just click here to get the book. |
Trap
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
done
The 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
The 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 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.
| My new 564-page book, Shell Scripting, published by Wiley, is on sale now. Please click "Like" on the left if you are on Facebook, or just click here to get the book. |
Steve's Bourne / Bash shell scripting tutorial
