我注意到,在 Fedora 17 中,关机操作(例如,shutdown -h now)变得快了很多(感觉最多只需要 2 秒)。所以我想知道正在运行的进程是否被正确终止?特别是在 Fedora 上(同样,大约需要 2 秒),我几乎无法想象每个进程都有足够的时间完成。
我假设在发出关机命令之前,每个用户进程都已被用户(手动)关闭,因此只剩下系统服务(不过,这些服务在退出时可能也有事要做)。
所以我写了一个小程序,它可以捕捉大多数信号,如果提供了秒数,它会在退出前等待。除此之外,它什么也不做。然后 - 首先在 Debian 系统上 - 我以 60 秒的延迟启动它。当它收到 SIGHUP 时(我假设它的父 shell 已终止),它开始 60 秒倒计时。10 秒后,它收到了友好的 SIGTERM。我的程序忽略了这个信号并继续倒计时 - 直到第 40 秒它悲惨地死掉了。因此,在被告知终止(SIGHUP)20 秒后,它被 SIGKILLed 了。
现在在Fedora 17(3.5.3-1.fc17.x86_64)上进行同样的测试:
捕获信号 1。
运行时间:8 秒
延迟终止 60 秒...
60...
捕获信号 15 - 忽略!
59...
58...
SIGHUP 发出后不到一秒钟,它就收到了 SIGTERM。程序员可能会在 SIGTERM 之后延迟终止程序,以便完成工作、保存设置等(不同于 SIGINT 之后)。我的程序在被终止前有 2 秒钟的时间。
如果在保存某些设置(损坏的设置文件?)时正在运行的进程被终止,或者某种守护进程(例如,某些文件服务器)正在将缓存数据写入磁盘(损坏的数据?)怎么办?
答案1
服务可以在其文件中指定它们希望如何终止*.service
。您可以选择任何您想要的超时时间,而不必使用默认值。如果您安装了 postgreSQL 或 mysqld,请查看它们的服务文件以了解它们如何安排干净关闭。