【发布时间】:2019-10-10 17:00:53
【问题描述】:
如何让 Linux 等到我的 C++ 程序完成其清理例程。程序最初调用函数sigaction(2) 来注册一个自定义的 SIGTERM 处理程序。如果通过运行kill -s TERM $(ps -C a.out -o pid=) 来测试处理程序,则没有问题。但是,在真正的关机中却是另外一回事。有时处理程序可以完成所有工作,但有时不能。显然,机器关闭时存在竞争条件。有谁知道如何让系统等待更长的时间以避免竞争条件?谢谢。
【问题讨论】:
-
这取决于您的 Linux 发行版使用的
init系统类型:经典 SysVinit、upstart。systemd或者更不常见的?如果您不知道,请至少告诉您 Linux 发行版的名称和版本。通常,如果您创建适当的配置以在启动时自动启动程序,它还将包括一种指定关闭时等待多长时间的方法。如果你只是手动启动你的程序,在关闭的时候让它死掉,就会被“松散进程的一般处理”处理,这对你的程序来说可能过于严格了。 -
@telcoM 所以快速回答是“不,你不能,除非你在 /etc/rc6.d/ 中放一些东西来用 IPC 关闭你的应用程序并等待它完成。”?
-
使用
systemd时,可以将kill命令指定为ExecStop=命令,然后指定TimeoutStopSec=值来调整超时时间。使用SysVinit,在关闭时杀死松散进程通常发生得很晚,当然只有在任何特定于服务的关闭脚本完成之后,所以只需有一个启动/关闭脚本在关闭过程的早期阶段发送信号并且可以选择使用sleep或其他东西,以便在程序的关闭脚本退出之前为您的服务提供更多时间。 -
换句话说,快速回答是“是的,但是实现所需行为的推荐方法取决于所使用的初始化系统。”
-
也许;这取决于您使用的 Linux 发行版以及它具有的 init 系统。在 RHEL 6.x 中,
init.d脚本需要额外的锁定文件,这会导致关闭脚本跳过手动启动的内容,而无需使用启动脚本。在systemd中,systemd工作方式固有的类似行为。 能否请您透露您所询问的 Linux 发行版?