我有一个 Bash 父脚本,它在意外输入时调用一个记录错误的错误日志子脚本。我还希望在发生错误并调用错误脚本时停止执行。但是,如果我exit
从错误处理脚本中调用它并不会停止父脚本的执行。我该如何停止孩子的父脚本?
问问题
17161 次
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 回答