Bash - Exit parent script from child script

后端 未结 5 1738
盖世英雄少女心
盖世英雄少女心 2020-12-16 13:34

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 th

相关标签:
5条回答
  • 2020-12-16 14:14

    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

    0 讨论(0)
  • 2020-12-16 14:27

    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; }
    
    0 讨论(0)
  • 2020-12-16 14:31

    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) ;)

    0 讨论(0)
  • 2020-12-16 14:33

    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.

    0 讨论(0)
  • 2020-12-16 14:34

    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.

    0 讨论(0)
提交回复
热议问题