我试图运行Logitash监督与运行。 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秒后似乎杀死并重新启动Logstash Java处理。
我已经尝试设置-w选项,但似乎不再等待进程运行。
我该如何让runit正确让这个Java进程进程运行,并且只有在它死亡时才重新启动呢?
首先,安装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
你是正确的,必须将stderrredirect到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
这将为服务创build一个日志条目,设置要编辑的存根文件,创build一个目录来保存日志文件,并为日志服务提供符号链接以将输出转移到。
最后把这个放在/etc/sv/logstash/log/run
#!/bin/sh exec 2>&1 exec svlog -tt main
用sv restart logstash重新启动你的服务,等待几秒钟……你应该列出两个进程,你的logstash服务和svlog运行它。 logstash所有输出logstash将被input到svlog ,而svlog又会将一个日志文件写入/etc/sv/logstash/log/main符号链接,然后在/var/log/logstash/current 。 使用sv stop logstash终止logstash服务将允许任何最终输出刷新到svlog ,这将在退出之前写入磁盘。
事实certificate这并不是runit的问题,而是logstash。 但是,我没有看到错误,因为我没有捕捉到运行脚本的输出。 修改命令以结束
2>&1 >> /var/log/logstash_runner.log
将stderr和stdout写入文件。 这让我发现真正的问题是我需要在我的脚本中设置HOME,所以logstash可以findHOME / .netrc来使用Heroku插件进行身份validation。