Java 进程在 runit 下过早重启

Java 进程在 runit 下过早重启

我正在尝试使用 runit 在监控下运行 Logstash。我的 Logstash 运行脚本很简单

#!/bin/sh
SSL_CERT_DIR=/etc/ssl/certs exec /usr/bin/java -jar /usr/local/bin/logstash.jar agent -f /tmp/logstash.conf --log /var/log/logstash.log

如果我手动运行此脚本,则需要 30 或 45 秒才能正确启动进程并开始工作,但之后它会保持几个小时。但是,当我尝试执行sv start logstash它时,它会执行脚本(并且 Logstash 肯定会启动,因为我看到输出写入 /var/log/logstash.log),但 15 或 20 秒后,runit 似乎会终止并重新启动 Logstash java 进程。

我已尝试设置该-w选项,但它似乎不再等待该过程运行。

我怎样才能让 runit 正确运行这个 Java 进程,并且仅在它终止时重新启动它?

答案1

首先,安装svlog。使用它相当轻松。

其次,(假设服务定义位于 /etc/sv)将您的/etc/sv/logstash/run内容更改为:

#!/bin/sh
exec 2&>1
SSL_CERT_DIR=/etc/ssl/certs exec /usr/bin/java -jar /usr/local/bin/logstash.jar agent -f /tmp/logstash.conf --log /var/log/logstash.log

您说得对,stderr必须重定向至stdout

然后,执行以下操作(根据需要调整您的安装):

mkdir /etc/sv/logstash/log
touch /etc/sv/logstash/log/run
chmod 744 /etc/sv/logstash/log/run
mkdir /var/log/logstash
chown log /var/log/logstash
chmod 775 /var/log/logstash
ln -s /var/log/logstash /etc/sv/logstash/log/main

这将为服务创建一个日志条目,设置一个要编辑的存根文件,创建一个目录来保存日志文件,并为日志服务提供一个符号链接以转移输出。

最后,把这个放进去/etc/sv/logstash/log/run

#!/bin/sh
exec 2>&1
exec svlog -tt main

使用 sv restart logstash 重新启动服务并等待几秒钟...你应该已经列出的进程、您的logstash服务以及svlog与之一起运行的进程。来自的所有输出logstash都将输入到svlog,后者又将日志文件写入符号/etc/sv/logstash/log/main链接,后者又会从 中删除/var/log/logstash/current。使用 终止logstash服务sv stop logstash将允许任何最终输出刷新到svlog,并在退出前将其写入磁盘。

答案2

事实证明这不是 runit 的问题,而是 logstash 的问题。但是,我没有看到错误,因为我没有捕获运行脚本的输出。修改命令以结束

2>&1 >> /var/log/logstash_runner.log

将 stderr 和 stdout 写入文件。这让我发现真正的问题是我需要在脚本中设置 HOME,以便 logstash 可以找到 HOME/.netrc 来使用 Heroku 插件进行身份验证。

相关内容