Created
August 9, 2024 19:42
-
-
Save sertraline/1106d113fb573eaac91a64211570888b to your computer and use it in GitHub Desktop.
bash handle SIGINT (https://stackoverflow.com/a/67498490)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Will be set to 1 by the SIGINT ignoring/postponing handler | |
declare -ig SIGINT_RECEIVED=0 | |
# On <CTRL>+C or "kill -s SIGINT $$" set flag for later examination | |
function _set_SIGINT_RECEIVED { | |
SIGINT_RECEIVED=1 | |
} | |
# Set to 1 if you want to keep bash running after handling SIGINT in a particular way | |
# or to 0 (or any other value) to run original SIGINT action after postponing SIGINT | |
ignore_SIGINT_after_handling=1 | |
# Remember current SIGINT handler | |
old_SIGINT_handler=$(trap -p SIGINT) | |
# Prepare for later restoration via ${old_SIGINT_handler} | |
old_SIGINT_handler=${old_SIGINT_handler:-trap - SIGINT} | |
# Start your "transaction", which should NOT be disturbed by SIGINT | |
trap -- '_set_SIGINT_RECEIVED' SIGINT | |
# Do your work, for eample | |
(./program) & | |
programPID=$! | |
wait ${programPID} | |
while [ $? -ge 128 ]; do | |
# 1st opportunity to place a part of your **handler actions** is here | |
# i.e. send SIGINT to ${programPID} and make sure that it is only sent once | |
# even if MAIN receives more SIGINT's during this loop | |
wait ${programPID} | |
done | |
# End of your "transaction" | |
# Look whether SIGINT was received | |
if [ ${SIGINT_RECEIVED} -eq 1 ]; then | |
# Your postponed **handler actions** are here | |
echo -e "\nMAIN is doing postponed work now..." | |
if [ ${ignore_SIGINT_after_handling} -eq 1 ]; then | |
echo "... and continuing with normal program execution..." | |
else | |
echo "... and restoring old SIGINT handler and sending SIGINT via 'kill -s SIGINT \$\$'" | |
${old_SIGINT_handler} | |
kill -s SIGINT $$ | |
fi | |
fi | |
# Restore "old" SIGINT behaviour | |
${old_SIGINT_handler} | |
# Prepare for next "transaction" | |
SIGINT_RECEIVED=0 | |
echo "" | |
echo "This message has to be shown in the case of normal program execution" | |
echo "as well as after a caught and handled and then ignored SIGINT" | |
echo "End of MAIN script received" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment