Search code examples
bashwaitexitkeyboard-eventssigint

Prevent CTRL+C being sent to process called from a Bash script


Here is a simplified version of some code I am working on:

#!/bin/bash

term() {
  echo ctrl c pressed!
  # perform cleanup - don't exit immediately
}
trap term SIGINT

sleep 100 &
wait $!

As you can see, I would like to trap CTRL+C / SIGINT and handle these with a custom function to perform some cleanup operation, rather than exiting immediately.

However, upon pressing CTRL+C, what actually seems to happen is that, while I see ctrl c pressed! is echoed as expected, the wait command is also killed which I would not like to happen (part of my cleanup operation kills sleep a bit later but first does some other things). Is there a way I can prevent this, i.e. stop CTRL+C input being sent to the wait command?


Solution

  • I ended up using a modified version of what @thatotherguy suggested:

    #!/bin/bash
    
    term() {
      echo ctrl c pressed!
      # perform cleanup - don't exit immediately
    }
    trap term SIGINT
    
    sleep 100 &
    pid=$!
    
    while ps -p $pid > /dev/null; do
      wait $pid
    done
    

    This checks if the process is still running and, if so, runs wait again.