Search code examples
bashsignalskill

How do I stop a signal from killing my Bash script?


I want an infinite loop to keep on running, and only temporarily be interrupted by a kill signal. I've tried SIGINT, SIGUSR1, SIGUSR2. All of them seem to halt the loop. I even tried SIGINFO, but that wasn't supported by Linux.

#!/bin/bash
echo $$ > /tmp/pid  # Save the pid

function do_something {
    echo "I am doing stuff" #let's do this now, and go back to doing the thing that is to be done over and over again.
#exit
}


while :
do
    echo "This should be done over and over again, but always wait for someething else to be done in between"

    trap do_something SIGINT
    while `true`
    do
            sleep 1 #so we're waiting for that other thing.
    done

done

My code runs the function once, after getting a INT signal from another script, but then never again. It halts.

EDIT: Although I accidentally put en exit at the end of the function, here on Stack Overflow, I didn't in the actual code I used. Either way, it made no difference. The solution is SIGTERM as described by Tiago.


Solution

  • I believe you're looking for SIGTERM:

    Example:

    #! /bin/bash
    
    trap -- '' SIGINT SIGTERM
    while true; do
        date +%F_%T
        sleep 1
    done
    

    Running this example cTRL+C won't kill it nor kill <pid> you can however kill it with kill -9 <pid>.

    If you don't want CTRL+Z to interrupt use: trap -- '' SIGINT SIGTERM SIGTSTP