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 程序執行並且只在它死時重新啟動它?
事實證明,這不是 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
其中將在退出之前寫入磁碟。