如何安全地停止 Logstash 进程?
安全停止 Logstash:systemd 管理用 systemctl stop;手动启动用 kill -TERM 发 SIGTERM 信号;前台运行用 Ctrl+C。SIGTERM 让 Logstash 优雅关闭,处理完管道中的事件再退出。
安全停止的关键是发送 SIGTERM 信号:Logstash 收到后会停止接收新事件、把管道里已有的事件处理完再退出,不会丢数据。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)文件可能处于不一致状态;
- sincedb 等状态文件可能损坏。
优雅关闭可能需要几秒到几分钟(取决于管道中积压的事件量),耐心等待。
加速关闭的配置
如果优雅关闭太慢,可以在 logstash.yml 中调整:
pipeline.unsafe_shutdown: false # 默认 false=优雅关闭
# 设为 true 会强制立即退出,可能丢数据,不推荐生产使用
常见问题(FAQ)
Q:stop 命令后 Logstash 一直不退出?
A:通常是 output 插件在等下游(如 Elasticsearch 不可用时会重试)。检查日志确认原因;实在不行再考虑 kill -9。
Q:Ctrl+C 一次和两次的区别?
A:按一次发 SIGTERM 优雅关闭;再按一次会强制退出(可能丢数据)。
Q:怎么确认 Logstash 已完全停止?
A:ps aux | grep logstash 无进程,且日志中出现 Logstash shut down 字样。