Java

Java程序在runit下過早重啟

  • September 3, 2014

我正在嘗試在 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 程序執行並且只在它死時重新啟動它?

事實證明,這不是 runit 的問題,而是 logstash 的問題。但是,我沒有看到錯誤,因為我沒有擷取執行腳本的輸出。修改命令以結束

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

將 stderr 和 stdout 寫入文件。這讓我發現真正的問題是我需要在我的腳本中設置 HOME 以便logstash 可以找到 HOME/.netrc 來使用 Heroku 外掛進行身份驗證。

首先,安裝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其中將在退出之前寫入磁碟。

引用自:https://serverfault.com/questions/570313