Bash Trap Command
Sometimes you would like to interrupt your running bash program to respond to events or signal/interrupt sent to the program to handle specific scenarios like reloading configurations or stop doing something for some time etc.
bash trap syntax:
$ trap [COMMANDS] [SIGNALS]
#!/bin/bash trap "echo \"Need to stop\"" SIGTERM echo $$ while (true) ; do echo $i i=`expr $i + 1` sleep 10 done
in the above example as you can see once we send kill -15 (or SIGTERM) to above process it will exit out of while loop, which is an infinite loop to go through trap commands and then continue with the iteration.
below is the output of the program when you run it
$ ./bash 30851 1 2 3 4 5 6 7 8 Need to stop 9 10 11 Need to stop 12 13 ^C [bitarray@]$
30851 is the pid of the process
kill -15 was sent to the above running program (twice):
$ kill -15 30851 [bitarray@]$ kill -15 30851
You can have multiple commands in the trap (for example if you want to send an event to zip old log files and create new log files for the start of the day without stopping your program.
#!/bin/bash trap "cd /apps/dir/;touch logfile.<date>;mv /apps/dir/<date> /apps/dir/<<date>.1" SIGTERM echo $$ while (true) ; do echo $i i=`expr $i + 1` sleep 2 done
Remember SIGKILL (kill -9) cannot be captured.
bash trap EXIT
trap exit will run if bash scripts due to any reason, this is very useful to run cleanup tasks (like if you want to remove pid files or files created during processing) or tasks which got interrupted due to some reason.
example
#!/bin/bash trap "rm -v /tmp/trap.pid" EXIT echo $$ echo $$ >/tmp/trap.pid while (true) ; do echo $i i=`expr $i + 1` sleep 2 done $ ./bash 442 1 2 3 4 5 6 7 removed ‘/tmp/trap.pid’ Illegal instruction (core dumped)
we sent kill signal to above program and before exiting it removed pid file!
$ kill -4 442
How to get a list of all signals?
$ 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