我见过很多流程经理试图这样做。我的理解是您应该只使用 SIGTERM 来终止进程。该过程可能需要未知的时间来自行清理;在缓慢的系统上,可能需要几分钟。我一直认为唯一的解决办法就是耐心等待程序清理干净并优雅退出。如果该进程没有捕获 SIGTERM,那么这是一个错误,应该报告给软件的维护者。
我已经看到像 docker 这样的流行工具也试图这样做:
用法:docker stop [OPTIONS] CONTAINER [CONTAINER...]
停止正在运行的容器(发送 SIGTERM,然后在宽限期后发送 SIGKILL)
这是不好的做法吗?我还好奇的一件事是关闭过程如何在 SystemV 风格的初始化系统上工作。我查看了一些联机帮助页和其他一些问题,但找不到明确的答案。我猜每个 init 服务(术语?)都会看到运行级别的变化并执行 init 脚本中定义的正确“停止”函数。它是否逐一执行此操作,以确保每项服务都正确结束?未由 init 脚本处理的进程会发生什么?我已经看到一些问题模糊地提到了在 SIGKILL 之前使用的宽限期,但我希望有人能详细说明或至少指出我正确的方向。:)
如果有人可以帮助我了解更多有关 systemd 如何工作的信息,我很乐意研究并了解更多信息。我看过手册页,但在这里也找不到任何明确的内容。