给出 SIGTERM 后,在多大程度上可以依赖写入磁盘?

Posted

技术标签:

【中文标题】给出 SIGTERM 后,在多大程度上可以依赖写入磁盘?【英文标题】:To What Extent Can One Rely on Writing to Disk When SIGTERM is Given? 【发布时间】:2014-09-14 01:08:01 【问题描述】:

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

我也熟悉login manager发出的PrepareForShutdown D-Bus信号。收听SIGTERM 产生的代码比禁止关机和收听PrepareForShutdown 信号更简单。 SIGTERM 的另一个优点是它可以处理守护进程被礼貌地杀死的情况,即使系统关闭了。

但是,我不确定依靠内核在关机时发送的SIGTERM 信号有多安全。关闭时SIGTERM 总是发送给每个进程,并有足够的时间执行对磁盘的小(

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

【问题讨论】:

为什么会引起关注?与其说是编码问题,不如说是系统管理员问题! 没有系统管理员,所以不管是不是编码问题,我都关心。 那么实际的平台是什么?一些嵌入式Linux的东西?用什么样的磁盘和文件系统?? 【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

我的问题是确定是否有时间写入磁盘取决于整个系统的设置方式。您的回答说明了这一点,所以谢谢。

以上是关于给出 SIGTERM 后,在多大程度上可以依赖写入磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

在使用设计模式时,您可以在多大程度上防止修改现有代码?

PostgreSQL 在多大程度上支持并行 DDL?

您可以在多大程度上自定义 Fabric 的 Digits 在 Android 上的流程、外观和感觉?

ImageMagick 在将 PSD 文件转换为 GIF、PNG、JPG 文件时可以在多大程度上保留剪切路径?

损失函数

.神经网络的学习—损失函数