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