我想我可能暂时做错了一段时间,因为我们刚刚切换到systemd而且它正在考虑我干净利落的进程结束失败。
基本上我会倾听SIGHUP
,SIGINT
和SIGTERM
然后(通过将信号代码重新传递回main
),例如return 128+SIGHUP
。
我希望这可以用来填充$?
,但现在我想我明白shell负责给$?
这样的值,然后只有当信号未处理时。因此,即使该过程最终由于信号而退出,因为信号已被处理,$?
将最终为0
,并且所有与退出信号有关的证据都将丢失。是吗?
在处理SIGHUP
并彻底退出时,我应return EXIT_SUCCESS
来自main
吗?
答案 0 :(得分:5)
高级Bash脚本编写指南(https://stackoverflow.com/a/1535733/567292)推广了返回128 + <signal number>
的惯例,但仅适用于您的程序失败的情况接收信号。
如果您的程序收到信号,不处理它,并因此终止,退出状态(例如由wait
提供)将类似但不是位7集将设置更高的位以指示WIFSIGNALED
而不是WIFEXITED
。如果你在shell中运行,那么translated by the shell将提供128-255范围内的退出状态($?
)(即设置了第7位),因此就shell脚本而言关注的是,返回128+n
的程序与终止的程序无法区分,因为信号未处理:
[...]当使用特殊参数'?'报告退出状态时,shell应报告可用的完整8位退出状态。由于收到信号而终止的命令的退出状态应报告为大于128。
如果您的程序收到信号,然后成功退出,则视为成功终止,因此您的程序应返回EXIT_SUCCESS
。
答案 1 :(得分:2)
返回代码通常是您指定的代码。如果要在退出代码中包含信号,则必须确保它们仍然保持唯一。
如果您不需要退出代码中的信号,那么似乎没有理由包含它们。
是否退回EXIT_SUCCESS
或EXIT_FAILURE
取决于您/您的计划,无论终止是成功还是失败。