簡介
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
注意 supervisord
跟 supervisorctl
的路徑是可執行程序的實際路徑
註冊且啓動服務
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"