You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SIGTERM触发trap时未返回143错误码的技术问询

为什么SIGTERM没有被报告为143?

咱们来拆解一下这个问题的核心原因:

当信号触发trap函数时,$?的值是当前正在执行的命令的退出状态,而不是你预期的信号对应退出码。

你的脚本里,while循环一直在执行: ——这是Shell里的空操作命令,它总是返回0(成功状态)。当kill -15发送SIGTERM信号过来时,脚本正处于执行: 的状态,此时触发trap绑定的on_err函数,$?自然就继承了: 的退出状态0,所以你看到的输出是0 error happened,而不是预期的143。

那143是怎么来的?143等于128 + 15,这个值是当进程没有捕获信号,直接被SIGTERM终止时的退出码。但你的脚本通过trap "on_err" 2 15捕获了SIGTERM,进程并没有被信号杀死,而是转而执行trap里的函数,这种情况下$?不会自动变成128+信号编号。

如何修改才能获取预期的退出码?

如果你想在trap里拿到触发的信号对应的退出码(比如143),可以把信号编号作为参数传递给on_err函数,然后计算出128+信号值:

#!/bin/sh
echo "Running $(basename $0) $*"
function on_err {
    # 计算并输出128+信号编号,SIGTERM对应143,SIGINT对应130
    echo $((128 + $1))
    echo "error happened"
}
# 为每个信号单独设置trap,传递对应的信号编号
trap 'on_err 2' 2
trap 'on_err 15' 15
while true
do
    :
done

这样执行kill -15 pid后,脚本就会输出143 error happened,完全符合你的预期。

内容的提问来源于stack exchange,提问作者Ankur Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:33:37