3

我正在为 Linux 开发,并且有一个守护进程,当它被杀死时应该写入磁盘。可以将守护进程配置为SIGTERM在接收到该信号时侦听和写入磁盘。

我也熟悉登录管理器PrepareForShutdown发出的 D-Bus 信号。与禁止关闭和监听信号相比,监听会产生更简单的代码。另一个优点是它可以处理守护进程被礼貌地杀死的情况,即使系统关闭也是如此。SIGTERMPrepareForShutdownSIGTERM

但是,我不确定依靠SIGTERM内核在关闭时发送的信号有多安全。在关机时SIGTERM总是发送给每个进程有足够的时间来执行一个小的(< 1 kB)写入磁盘?

我担心的一个问题是,我可能有足够的时间在某些硬件上写入磁盘,但在其他硬件上却没有,因此似乎很难测试。信号也可以这样说PrepareForShutdown,但至少为磁盘写入留出足够的时间是该信号合同的一部分。SIGTERM我的问题是每个进程在关闭时收到的信号是否可以这样说。

4

1 回答 1

2

仔细 阅读signal(7) - 所以你不能fprintf来自信号处理程序。通常最明智的做法是volatile sigatomic_t在信号处理程序中设置一些变量,并在其外部测试该变量。

重点不仅仅是将一些数据写入(2)到文件系统。它是将数据写入磁盘(它可能留在内核文件系统缓冲区中)。阅读sync(2)fsync(2)

您不能(在所有情况下)确保数据已写入磁盘(尤其是在断电时)。

我不会打扰并使用syslog(3)(即让我的SIGTERM处理程序设置一个volatile sigatomic_t标志,然后在其他地方测试该标志;在终止呼叫时syslog......)。然后记录您的程序在终止时正在写入系统日志,并将确保系统日志写入(可能在网络上的某个磁盘上)的责任留给系统管理员。

关闭的具体行为主要是系统管理员问题。这实际上取决于实际系统(包括 linux 发行版和硬件)和系统管理员的技能。一些文件系统是远程的或(对于便宜的 USB 密钥)非常慢的文件系统(并且写入它们可能会丢失)。

还可以想象一个带有错误守护程序(不是您的,而是其他东西)的系统,该守护程序需要很长时间才能终止。那么你的守护进程可能没有时间做一些明智的事情。所以你必须信任系统管理员。

我不明白你为什么要问你的问题。这取决于整个系统的管理和设置方式。在百万美元的服务器和笔记本电脑上确实不同。

于 2014-07-23T05:14:47.573 回答