我正在尝试使用 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 插件进行身份验证。