当我们在 Linux 上开发一组复杂的服务时,我们开发了一个工具来逐个启动它们。创建此类工具的众多考虑因素之一是可以启动项目的顺序,但也是确保在守护进程死亡时,守护进程自动重新启动的一种方法。还有在所有服务之间共享的服务器范围的参数。
但是,我现在有一个问题,关闭这样的系统需要时间。关闭所有内容可能需要多达 10 秒的时间。
我想知道的是:下定义的脚本需要多长时间/etc/init.d/...
才能关闭它控制的守护进程?
虽然我想如果我们将所有这些守护进程分解在单独的包中(因为启动脚本现在可以包含依赖项列表......),我们会遇到完全相同的问题。所以在这一点上,我们更喜欢保持原样......
是否存在一个明确定义/已知的关闭时间,最多必须花费多少时间才能对所有守护进程保持优雅?
不。
当我现在在运行 systemd 的系统上测试关闭各种守护程序时,我可以证明每个守护程序都明确定义了超时。
据我所知,它也适用于仍然使用 SysV 脚本启动/停止的守护进程。当 Cassandra 仍在处理其文件时,执行 a
systemctl restart cassandra
将无法按预期工作。对于此类服务,您可能想要执行 asystemctl stop cassandra
并且一旦您确定它已停止,执行systemctl start cassandra
.TimeoutStopSec
所以...您可以在每个守护程序的基础上定义/更改参数。这让你有很大的粒度!您可以更改系统默认值:(
DefaultTimeoutStartSec
这可能是不可取的......)还有一个重要的时机,就是重启功能(见最后一个链接)。非常重要,因为systemd默认要在100ms内重启一个进程!!!因此,如果您的守护程序需要 2 分钟才能关闭,它就无法正常工作......
对于那些感兴趣的人,对于 Cassandra,我实际上首先运行了一个停止 Cassandra 的脚本。然后我继续关机。
这可能需要 Cassandra 需要的时间(可能会很长),但它会彻底停止 Cassandra。请注意,以这种方式关闭可能感觉很长,但在重新启动时,Cassandra 几乎会立即准备就绪。
相比之下,快速关闭意味着杀死 Cassandra,并且在重新启动时它必须返回其日志,这实际上要长得多。所以这是一个很好的权衡。