18

我有一个 Bash 父脚本,它在意外输入时调用一个记录错误的错误日志子脚本。我还希望在发生错误并调用错误脚本时停止执行。但是,如果我exit从错误处理脚本中调用它并不会停止父脚本的执行。我该如何停止孩子的父脚本?

4

5 回答 5

15

尝试..

#normal flow
[[ $(check_error_condition) ]] && /some/error_reporter.sh || exit 1

所以,

  • 当 error_reporter 以退出状态 > 0 退出时,父级也将终止
  • 如果 error_reporter 将以 status = 0 退出,则父级继续...

你不想要stop the parent from a child父母通常不喜欢这种行为):),你想要tell to parent - need stop,他会停止自己(如果想要的话);)

于 2013-04-25T12:58:49.677 回答
9

尝试:

在父脚本中:

trap "echo exitting because my child killed me.>&2;exit" SIGUSR1

在子脚本中:

kill -SIGUSR1 `ps --pid $$ -oppid=`; exit

另一种方法是:

在子脚本中:

kill -9 `ps --pid $$ -oppid=`; exit

但是,不建议这样做,因为父母需要一些关于被杀的信息,因此如果需要,请进行一些清理。


另一种方式:而不是调用子脚本,exec它。


但是,正如在其他答案中指出的那样,最干净的方法是在孩子返回后从父母那里退出。

于 2013-04-25T13:04:31.660 回答
0

不要试图从孩子中终止父母。而是exit在子脚本返回后调用父级。

if [ condition ]; then
  /path/to/child.sh
  exit 1
fi

或更短

[ condition ] && { /path/to/child.sh; exit 1; }
于 2013-04-25T12:57:15.800 回答
0

@anishsane 注释的扩展,因为 MacOS 的ps语法略有不同。

在 Mac OS (Darwin) 下的子脚本中查找父进程 ID (ppid):

kill -SIGUSR1 $(ps $$ -o ppid=);exit

于 2019-12-27T07:51:16.740 回答
0

根据您的需要, set -e 在脚本顶部使用可能是一个不错的解决方案。如果任何命令(例如,您的错误检查脚本)以非零退出代码(https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/)退出,这将自动导致脚本退出

请注意,在正常情况下,有一些常见的命令具有非零退出代码。

于 2020-11-23T19:09:45.987 回答