linux 長期運行程序的 四種方法


完成上一節的初次運行后,你肯定會發現一點:一旦你按下 Ctrl+C,停下標准輸入輸出,logstash 進程也就隨之停止了。作為一個肯定要長期運行的程序,應該怎么處理呢?

本章節問題對於一個運維來說應該屬於基礎知識,鑒於 ELK 用戶很多其實不是運維,添加這段內容。

辦法有很多種,下面介紹四種最常用的辦法:

標准的 service 方式

采用 RPM、DEB 發行包安裝的讀者,推薦采用這種方式。發行包內,都自帶有 sysV 或者 systemd 風格的啟動程序/配置,你只需要直接使用即可。

以 RPM 為例,/etc/init.d/logstash 腳本中,會加載 /etc/init.d/functions 庫文件,利用其中的 daemon 函數,將 logstash 進程作為后台程序運行。

所以,你只需把自己寫好的配置文件,統一放在 /etc/logstash/conf.d 目錄下(注意目錄下所有配置文件都應該是 .conf 結尾,且不能有其他文本文件存在。因為 logstash agent 啟動的時候是讀取全文件夾的),然后運行 service logstash start 命令即可。

最基礎的 nohup 方式

這是最簡單的方式,也是 linux 新手們很容易搞混淆的一個經典問題:

command
command > /dev/null
command > /dev/null 2>&1
command &
command > /dev/null &
command > /dev/null 2>&1 &
command &> /dev/null
nohup command &> /dev/null

請回答以上命令的異同……

具體不一一解釋了。直接說答案,想要維持一個長期后台運行的 logstash,你需要同時在命令前面加 nohup,后面加 &

更優雅的 SCREEN 方式

screen 算是 linux 運維一個中高級技巧。通過 screen 命令創建的環境下運行的終端命令,其父進程不是 sshd 登錄會話,而是 screen 。這樣就可以即避免用戶退出進程消失的問題,又隨時能重新接管回終端繼續操作。

創建獨立的 screen 命令如下:

screen -dmS elkscreen_1

接管連入創建的 elkscreen_1 命令如下:

screen -r elkscreen_1

然后你可以看到一個一模一樣的終端,運行 logstash 之后,不要按 Ctrl+C,而是按 Ctrl+A+D 鍵,斷開環境。想重新接管,依然 screen -r elkscreen_1 即可。

如果創建了多個 screen,查看列表命令如下:

screen -list

最推薦的 daemontools 方式

不管是 nohup 還是 screen,都不是可以很方便管理的方式,在運維管理一個 ELK 集群的時候,必須尋找一種盡可能簡潔的辦法。所以,對於需要長期后台運行的大量程序(注意大量,如果就一個進程,還是學習一下怎么寫 init 腳本吧),推薦大家使用一款 daemontools 工具。

daemontools 是一個軟件名稱,不過配置略復雜。所以這里我其實是用其名稱來指代整個同類產品,包括但不限於 python 實現的 supervisord,perl 實現的 ubic,ruby 實現的 god 等。

以 supervisord 為例,因為這個出來的比較早,可以直接通過 EPEL 倉庫安裝。

yum -y install supervisord --enablerepo=epel

/etc/supervisord.conf 配置文件里添加內容,定義你要啟動的程序:

[program:elkpro_1]
environment=LS_HEAP_SIZE=5000m
directory=/opt/logstash
command=/opt/logstash/bin/logstash -f /etc/logstash/pro1.conf -w 10 -l /var/log/logstash/pro1.log
[program:elkpro_2]
environment=LS_HEAP_SIZE=5000m
directory=/opt/logstash
command=/opt/logstash/bin/logstash -f /etc/logstash/pro2.conf -w 10 -l /var/log/logstash/pro2.log

然后啟動 service supervisord start 即可。

logstash 會以 supervisord 子進程的身份運行,你還可以使用 supervisorctl 命令,單獨控制一系列 logstash 子進程中某一個進程的啟停操作:

supervisorctl stop elkpro_2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM