因此,根据我对 Unix/Linux 关闭过程的理解(我承认这是非常有限的),我认为在某些时候会发生以下步骤: 1. 已安装的驱动器被卸载 2. 终止信号被发送到正在运行的应用程序,这允许那些应用程序退出前进行清理
现在,哪一个先发生?或者#1根本就没有发生?或者订单不保证?
我问这个问题的原因是我正在开发一个应用程序,该应用程序在关闭时将数据写入中央配置文件,其中中央配置文件可以放置在任何地方。我担心的是,如果中央配置文件位于已安装的驱动器上,并且 #1 发生在 #2 之前,那么我为中央配置文件存储的路径可能不再有效。这种担忧有道理吗?
答案1
这取决于 init 系统及其配置方式。但任何合理的配置都允许系统软件注册一个钩子以在关闭时运行。对于传统的 System V init,这是一个/etc/rc0.d
.对于传统的 BSD init,这是/etc/rc.shutdown
.对于 Upstart,这是运行级别更改为 0 或 6 的事件。这样的例子不胜枚举,这就是为什么维护所有发行版的软件包可能需要大量工作(大多数作者会为其应用程序提供一个关闭脚本,并让发行版维护者制作一个包,在正确的位置注册关闭脚本)。
一旦所有应用程序特定的脚本都执行完毕,关闭的最后阶段就会发生。通常,这涉及卸载除仍存在打开文件的文件系统之外的所有文件系统,然后终止所有剩余进程,最后卸载剩余文件系统(以只读方式重新安装的根除外)并停止或重新启动计算机。通常向所有进程发送一个可捕获的 TERM 信号,然后几秒钟后发送一个 KILL 信号。虽然进程可以尝试做出反应,但时间有限,系统不会等待。
因此,如果您的应用程序以 root 身份安装,您只需注册一个关闭时初始化脚本即可。如果您的应用程序是由非特权用户安装的,则无法保证您能够在关闭阶段执行任何操作。
请注意,无论如何,您都需要妥善处理系统崩溃或电源故障。关机时的操作应仅限于使下次启动更有效的事情,不应该有任何绝对需要做的事情。