我正在为Linux开发并且有一个守护进程,它应该在被杀死时写入磁盘。可以将守护程序配置为侦听SIGTERM
并在收到该信号时写入磁盘。
我也熟悉login manager发出的PrepareForShutdown
D-Bus信号。收听SIGTERM
会产生比禁止关闭和收听PrepareForShutdown
信号更简单的代码。 SIGTERM
的另一个优点是,即使系统关闭,它也会处理守护进程被礼貌杀死的情况。
但是,我不确定在关机时依赖内核发送的SIGTERM
信号是多么安全。在关闭时,SIGTERM
总是发送到每个进程,有足够的时间执行一次小的(<1 kB)写入磁盘?
我所担心的一个问题是,我可能有足够的时间在某些硬件上写入磁盘但在其他硬件上没有写入磁盘,所以看起来很难测试。对PrepareForShutdown
信号也是如此,但至少允许足够的时间进行磁盘写入是该信号合约的一部分。我的问题是,对于每个进程在关闭时收到的SIGTERM
信号是否可以这样说。
答案 0 :(得分:2)
仔细阅读 signal(7) - 这样您就无法从信号处理程序中fprintf
。通常,最明智的做法是在信号处理程序中设置一些volatile sigatomic_t
变量,并在其外部测试该变量。
关键点不仅是write(2)文件系统的一些数据。它是将数据写入磁盘(它可能保留在内核文件系统缓冲区中)。阅读sync(2)&amp; fsync(2)
您无法(在所有情况下)确保将数据写入磁盘(特别是在停电时)。
我不打扰并使用syslog(3)(即让我的SIGTERM
处理程序设置volatile sigatomic_t
标志,然后在其他地方测试该标志;在终止呼叫syslog
上。 )。然后记录您的程序正在写入终止时的系统日志,并保留确保系统日志被写入系统管理员的某些磁盘(可能在网络上的某个磁盘)的责任。
关闭的具体行为主要是系统管理员问题。这实际上取决于实际系统(包括Linux发行版和硬件)以及系统管理员的技能。有些文件系统是远程的或(对于便宜的USB密钥)非常慢的文件系统(写入它们可能丢失)。
想象一下,一个带有越野车守护进程的系统(不是你的,但其他东西)需要很长时间才能终止。然后你的守护进程可能没有时间去做一些明智的事情。所以你必须信任系统管理员。
我不明白你为什么问你的问题。这取决于整个系统的管理和设置方式。百万美元的服务器和笔记本电脑真的不同。