運維神器-supervisor使用指南

簡介

supervisor是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具。可以很方便的監聽、啓動、停止、重啓一個或多個進程。用supervisor管理的進程,當一個進程意外被殺死,supervisor監聽到進程死後,會自動將它重啓,很方便的做到進程自動恢復的功能,不再需要自己寫shell腳本來控制。

安裝

注意 supervisor 已經支持python3了。

pip install supervisor 

或者

easy_install supervisor

執行程序

  • supervisord supervisor服務端程序
  • supervisorctl supervisor客戶端程序或者類似shell命令行程序,具體操作類似systemctl可以啓停指定或者全局服務。

配置

使用系統的缺省配置

echo_supervisord_conf > /etc/supervisord.conf

默認配置中使用的/tmp路徑來存放相關信息,需要將其修改成一個穩定的路徑。

mkdir /var/supervisor
sed -i 's/\/tmp/\/var\/supervisor/g' /etc/supervisord.conf

文件中分成了幾塊,主要有如下

  • unix_http_server 配置sock文件,通過xml_rpc來進行遠程管理supervisord運行服務,非必須配置
  • inet_http_server 搭建web服務,通過http協議來進行遠程管理supervisord運行服務,非必須配置
  • supervisord 服務端supervisord的基本配置
  • supervisorctl 客戶端supervisorctl的基本配置,默認是用sock文件來管理本地服務端supervisord的運行
  • include 引入更多的配置項,支持通配符,支持相對路勁配置
  • program:[your program name] 用於配置supervisord需要監控的服務
  • groups:[your group name] 用於整合program,形成一組統一管理

詳細配置參考官方文檔

配置

通用的項目配置模板,具體參數查看註釋

[program:test]
directory=/data/release/test ; 項目路勁
command=/usr/local/python3.6.7/bin/uwsgi --ini test.ini ; 啓動命令
autostart=false ; supervisord啓動時是否啓動
autorestart=true ; 這個是設置子進程掛掉後自動重啓的情況,有三個選項,false,unexpected和true。如果爲false的時候,無論什麼情況下,都不會被重新啓動,如果爲unexpected,只有當進程的退出碼不在下面的exitcodes裏面定義的退出碼的時候,纔會被自動重啓。當爲true的時候,只要子進程掛掉,將會被無條件的重啓
startretries=10 ; 當進程啓動失敗後,最大嘗試啓動的次數。。當超過3次後,supervisor將把此進程的狀態置爲FAIL默認值爲3
startsecs=5 ; 這個選項是子進程啓動多少秒之後,此時狀態如果是running,則我們認爲啓動成功了,不要設置太少,如果程序啓動比較耗時的話,否則會啓動多個進程
stopasgroup=true ; 這個東西主要用於,supervisord管理的子進程,這個子進程本身還有子進程。那麼我們如果僅僅幹掉supervisord的子進程的話,子進程的子進程有可能會變成孤兒進程。所以咱們可以設置可個選項,把整個該子進程的整個進程組都幹掉。設置爲true的話,一般killasgroup也會被設置爲true。 需要注意的是,該選項發送的是stop信號
killasgroup=true ; 這個和上面的stopasgroup類似,不過發送的是kill信號
user = roger ;腳本運行的用戶身份,按需配置
stderr_logfile=/var/supervisor/blog_stderr.log #日誌輸出 
stdout_logfile=/var/supervisor/blog_stdout.log #日誌輸出 
redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes=20MB ;stdout 日誌文件大小,默認 50MB
stdout_logfile_backups=20 ;stdout 日誌文件備份數

注意不能用後臺執行模式,例如uwsgi不能使用daemonize

簡潔版本

[program:apollo]
directory=/data/apollo
command=/usr/local/python3.7.1/bin/uwsgi --ini /data/apollo/uwsgi_config.ini
autostart=true
autorestart=true
startretries=10
startsecs=5
stopasgroup=true
killasgroup=true
stderr_logfile=/var/supervisor/log/supervisor_apollo_stderr.log  
stdout_logfile=/var/supervisor/supervisor_apollo_stdout.log  
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20

運行與管理

配置 systemctl

修改文件 /usr/lib/systemd/system/supervisord.service

[Unit]
Description=Process Monitoring and Control Daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

注意 supervisordsupervisorctl 的路徑是可執行程序的實際路徑

註冊且啓動服務

systemctl enable supervisord.service
systemctl start supervisord.service

常用命令

重新加載配置

supervisorctl reload

停止所有服務

supervisorctl stop all

停止指定服務

supervisorctl stop <service-name>

注意事項

**supervisor是監控前臺程序的,不能監控後臺程序,也就是不要使用 daemon 拉起服務 ** ,例如uwsgi就不要使用-d或者配置文件中設置 daemonize,否則會報差

錯誤

重啓supervisorctl提示“unix:///tmp/supervisor.sock no such file”

/tmp/supervisor.sock 改成 /var/run/supervisor.sock,
/tmp/supervisord.log 改成 /var/log/supervisor.log,
/tmp/supervisord.pid 改成 /var/run/supervisor.pid
要不容易被linux自動清掉

如果啓動失敗提示 (ERROR (spawn error))

通過命令查看具體錯誤

supervisorctl tail <src-name> stdout

進不了路徑

例如錯誤顯示如下

couldn't chdir to /flink-1.9.1/bin; 項目路勁: ENOENT

可以看到路徑多了一個分號,就是之前配置文件 把註釋的分號當成路徑了,增加空格來去掉

無法使用權限root

錯誤顯示如下

supervisor: couldn't setuid to 0: Can't drop privilege as nonroot user

看下配置屬性user是否設置了不存在或非法權限用戶

顯示找不到環境變量

錯誤顯示

Please specify JAVA_HOME. Either in Flink config ./conf/flink-conf.yaml or as system-wide JAVA_HOME.

因爲supervisor啓動時並不會加載/etc/profile 文件。也不會讀取~/.bashrc。

但是supervisor 提供了一個配置參數enviroment來實現,配置如下

environment = JAVA_HOME="/opt/jdk1.8.0_102"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章