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	

 

Categories