如何安全地停止 Logstash 进程?

安全停止 Logstash:systemd 管理用 systemctl stop;手动启动用 kill -TERM 发 SIGTERM 信号;前台运行用 Ctrl+C。SIGTERM 请求 Logstash 受控关闭并尝试完成在途事件;持久队列是否排空取决于配置,不能保证无损。

最佳实践
如何安全地停止 Logstash 进程?封面

安全停止的关键是发送 SIGTERM 信号:Logstash 收到后会停止接收新事件、尝试完成在途事件后退出,但不能保证无损;是否等待持久队列全部排空还取决于 queue.drain。systemd 系统用 systemctl stop logstash,手动启动的用 kill -TERM <PID>,前台运行的直接 Ctrl+C。

三种场景

# 1. systemd 管理(生产环境最常见)
sudo systemctl stop logstash

# 2. 手动后台启动的进程
kill -TERM <logstash_pid>
# 找 PID:ps aux | grep logstash 或 jps -l

# 3. 前台运行调试时
# 直接按 Ctrl + C

为什么不能用 kill -9

kill -9(SIGKILL)会立即杀死进程:

  • 尚未持久化的在途事件可能丢失,已持久化且未确认的事件可能重放;
  • PQ/checkpoint 与输入位点持久化存在窗口,重启后可能重放或丢失尚未持久化事件;
  • 不能笼统断言每次强杀都会损坏 PQ 或 sincedb。

优雅关闭可能需要几秒到几分钟(取决于管道中积压的事件量),同时核对 systemd/Kubernetes 的停止超时,避免尚未完成就被 supervisor 强制终止。

加速关闭的配置

如果优雅关闭太慢,可以在 logstash.yml 中调整:

pipeline.unsafe_shutdown: false   # 默认 false=优雅关闭
# true 允许在有在途事件时强制关闭,可能丢数据,不是通用立即退出按钮

常见问题(FAQ)

Q:stop 命令后 Logstash 一直不退出?
A:通常是 output 插件在等下游(如 Elasticsearch 不可用时会重试)。检查日志确认原因;实在不行再考虑 kill -9。

Q:Ctrl+C 一次和两次的区别?
A:Ctrl+C 发送 SIGINT;首次通常请求受控关闭,再次中断行为需按版本和实际提示判断,可能丢数据。

Q:怎么确认 Logstash 已完全停止?
A:ps aux | grep logstash 无进程,且日志中出现 Logstash shut down 字样。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台