I have a Bash parent script that on unexpected input calls an error logging child script that logs the error. I also want the execution to halt when the error occurs and the error script is called. But if I call exit from the error handling script it does not stop the parent script from executing. How may I go about stopping a parent script from a child?
5 Answers
try..
#normal flow
[[ $(check_error_condition) ]] && /some/error_reporter.sh || exit 1
so,
- when the error_reporter will exit with exit status > 0 the parent will terminate too
- if the error_reporter will exit with status = 0 the parent continues...
You don't want stop the parent from a child (the parents usually don't like this behavior) :), you instead want tell to parent - need stop and he will stop itself (if want) ;)
3 Comments
Try:
In parent script:
trap "echo exitting because my child killed me.>&2;exit" SIGUSR1
In child script:
kill -SIGUSR1 `ps --pid $$ -oppid=`; exit
Other way was:
In child script:
kill -9 `ps --pid $$ -oppid=`; exit
But, it is not recommended, because the parent needs to have some information about getting killed & thus do some cleanup if required.
Another way:
Instead of calling the child script, exec it.
However, as pointed out in other answer, the cleanest way is to exit from parent, after the child returns.
Depending on your needs, using
set -e
at the top of your script might be a good solution. This will automatically cause the script to exit if any commands (e.g., your error checking script) exit with a non-zero exit code (https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/)
Note that there are some common commands that have non zero exit codes under normal circumstance.