Reputation: 2509
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?
Upvotes: 20
Views: 21739
Reputation: 11
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.
Upvotes: 0
Reputation: 63892
try..
#normal flow
[[ $(check_error_condition) ]] && /some/error_reporter.sh || exit 1
so,
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) ;)
Upvotes: 16
Reputation: 1
Extension to @anishsane comment because MacOS has little bit different ps
syntax.
Finding parent process ID (ppid) in child script under Mac OS (Darwin):
kill -SIGUSR1 $(ps $$ -o ppid=);exit
Upvotes: 0
Reputation: 200193
Don't try to terminate the parent from the child. Instead call exit
in the parent after the child script returned.
if [ condition ]; then
/path/to/child.sh
exit 1
fi
or shorter
[ condition ] && { /path/to/child.sh; exit 1; }
Upvotes: 0
Reputation: 20970
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.
Upvotes: 10