给出 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 后,在多大程度上可以依赖写入磁盘?的主要内容,如果未能解决你的问题,请参考以下文章
您可以在多大程度上自定义 Fabric 的 Digits 在 Android 上的流程、外观和感觉?