使用Supervisor實現Linux守護進程

本文作者:陳進堅
博客地址:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
聯繫方式:[email protected]

前言

做過系統軟件開發的人都會遇到,如果寫好的程序需要在Linux後臺運行時不太好處理,用nohup&放到後臺的話,很難對線程進行停止和重啓操作。Supervisor (http://supervisord.org) 是一個用 Python 寫的進程管理工具,可以很方便的實現啓動、重啓、關閉進程、意外停止自動重啓、日誌分割等功能。除了對單個進程的控制,還可以同時啓動、關閉多個進程,比如很不幸的服務器出問題導致所有應用程序都被殺死,此時可以用 supervisor 同時啓動所有應用程序而不是一個一個地敲命令啓動,同時Supervisor 提供web管理頁面可以進行遠程管理,非常方便。

安裝supervisor

Centos

[root@ztg ~]# yum install epel-release	#如果已經有python環境可以跳過前兩步
[root@ztg ~]# yum install -y python-pip
[root@ztg ~]# pip install supervisor

Ubuntu

[root@ztg ~]# apt-get install supervisor

配置supervisor

生成配置文件

[root@ztg ~]# echo_supervisord_conf > /etc/supervisord.conf

如果出現下面的錯誤

Traceback (most recent call last):
  File "/usr/bin/supervisord", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
    working_set.require(__requires__)
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: meld3>=0.6.5

請以此執行下面4行命令再生成配置文件

[root@ztg ~]# wget https://pypi.python.org/packages/source/m/meld3/meld3-1.0.2.tar.gz
[root@ztg ~]# tar -zxf meld3-1.0.2.tar.gz
[root@ztg ~]# cd meld3-1.0.2
[root@ztg ~]# python setup.py install

編輯/etc/supervisord.conf,在最後增加要自定義運行程序的配置信息:(舉例的httpserver是用golang實現的簡單的http服務程序)

[root@ztg ~]# vi /etc/supervisord.conf
[program:httpserver]
command=/bin/bash -c "/home/ztg/httpserver"
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/go_http_server_info.log
stdout_logfile_maxbytes=2MB
stdout_logfile_backups=30
stdout_capture_maxbytes=2MB
stderr_logfile=/var/log/go_http_server_error.log
stderr_logfile_maxbytes=2MB
stderr_logfile_backups=30
stderr_capture_maxbytes=2MB

配置說明

[program:程序名]
command=/bin/bash -c "需要執行的命令,多句命令用分號隔開"
autostart=true 是否跟隨supervisor一起啓動
autorestart=true 如果該程序掛了,是否重新啓動
startsecs=10
stdout_logfile=/var/log/go_http_server_info.log  終端標準輸出重定向文件
stdout_logfile_maxbytes=2MB	文件最大大小
stdout_logfile_backups=30	文件備份最大數量
stdout_capture_maxbytes=2MB	
stderr_logfile=/var/log/go_http_server_error.log	終端錯誤輸出重定向文件
stderr_logfile_maxbytes=2MB
stderr_logfile_backups=30
stderr_capture_maxbytes=2MB

操作supervisor

啓動supervisor,使用默認配置文件:

$ supervisord

或者指定配置文件:

$ /usr/bin/supervisord -c /etc/supervisord.conf

啓動supervisor之後可以執行supervisorctl相關命令

supervisorctl 常用命令:

命令 說明
supervisorctl stop program_name 停止某個進程
supervisorctl start program_name 啓動某個進程
supervisorctl restart program_name 重啓某個進程
supervisorctl stop all 停止全部進程
supervisorctl reload 載入最新的配置文件,停止原有進程並按新的配置啓動、管理所有進程
supervisorctl update 根據最新的配置文件,啓動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啓

查看運行狀態並進入控制檯,在控制檯中執行命令可以省去supervisorctl命令

$ supervisorctl
httpserver                       RUNNING   pid 34236, uptime 0:00:28
supervisor> stop httpserver
httpserver: stopped

Web管理頁面

supervisor提供了可視化的Web管理頁面,允許遠程操作,但是需要在配置文件手動打開。

打開配置文件

$ vi /etc/supervisord.conf

將下面幾行前面的分號去掉,修改一下數據保存退出

[inet_http_server]         ; HTTP 服務器,提供 web 管理界面
port=192.168.1.194:9001    ; Web 管理後臺運行的 IP 和端口,如果開放到公網,需要注意安全性
username=user              ; 登錄管理後臺的用戶名
password=123               ; 登錄管理後臺的密碼

重新載入配置

$ supervisorctl reload

在瀏覽器打開剛剛配置的ip和端口(192.168.1.194:9001)即可彈出登錄框進入管理頁面。

查看日誌

訪問配置文件中定義的日誌文件即可

$ tail -f /var/log/go_http_server_info.log
$ tail -f /var/log/go_http_server_error.log
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章