學完這篇教程後,我們希望達到如下的目標:
- 服務掛掉後,自動重啓
- 可執行文件或者配置文件修改後,服務自動重啓
讓我們開始吧!
1.supervisor安裝
1.以上tar包任意目錄解壓
# ubuntu安裝:
sudo apt-get install supervisor
# centos安裝
yum install -y supervisor
# 基於python庫安裝
pip2 install supervisor
easy_install supervisor
安裝好之後,不出問題的話supervisor服務已經啓動完成。
查看進程是否啓動成功
pgrep supervisord
出現進程號之後表面成功啓動
手動啓動進程
如果上一步沒發現進程號,那麼可以執行下面的命令
supervisord -c /etc/supervisor/supervisord.conf
2.supervisor配置
打開配置文件supervisord.conf
# 配置文件一般在如下位置:
> vim /etc/supervisor/supervisord.conf
我們可以看到文件的最後有這麼一句話
[include]
files = /etc/supervisor/conf.d/*.conf
也就是說配置文件會引入/etc/supervisor/conf.d/
目錄下所有conf
後綴的文件.
創建自定義的服務配置文件
所以我們可以在/etc/supervisor/conf.d/
下建立文件ipfs.conf
這裏是以啓動ipfs爲例, 日誌路徑不存在的要自己新建, supervisor不會自己創建目錄
; 設置進程的名稱,使用 supervisorctl 來管理進程時需要使用該進程名
[program:ipfs]
directory = /usr/local/bin ; 程序的啓動目錄
command=/usr/local/bin/ipfs daemon ; 啓動命令 最好絕對路徑
autostart = true ; 在 supervisord 啓動的時候也自動啓動
numprocs=1 ; 默認爲1
process_name=%(program_name)s ; 默認爲 %(program_name)s,即 [program:x] 中的 x
user=root ; 使用 root 用戶來啓動該進程
autorestart=true ; 程序崩潰時自動重啓,重啓次數是有限制的,默認爲3次
redirect_stderr=true ; 重定向輸出的日誌
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info
配置文件中的註釋以
;
打頭
保存配置文件,重啓
> supervisorctl reload
3.supervisor常用命令
supervisor有supervisord和supervisorctl兩種命令類型:
- supervisord是服務相關的命令
- supervisorctl是客戶端相關的命令
supervisor涉及的狀態主要有
- running:進程處於運行狀態
- starting:Supervisor 收到啓動請求後,進程處於正在啓動過程中
- stopped:進程處於關閉狀態
- stopping:Supervisor 收到關閉請求後,進程處於正在關閉過程中
- backoff:進程進入 starting 狀態後,由於馬上就退出導致沒能進入 running 狀態
- fatal:進程沒有正常啓動
- exited:進程從 running 狀態退出
常用的命令如下:
#關閉所有任務
supervisorctl shutdown
# 啓動某個進程
supervisorctl start programxxx
# 重啓某個進程
supervisorctl restart programxxx
# 停止全部進程 注:start、restart、stop都不會載入最新的配置文件
supervisorctl stop all
# 載入最新的配置文件,停止原有進程並按新的配置啓動、管理所有進程。
supervisorctl reload
# 根據最新的配置文件,啓動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啓。
supervisorctl update
注意:顯式用stop停止掉的進程,用reload或者update都不會自動重啓
4.可能遇到的錯誤
無權限錯誤
error: <class 'socket.error'>, [Errno 2] No such file or directory:
file: /usr/lib/python2.7/socket.py line: 228
解決方案: 重啓服務
> supervisord -c /etc/supervisor/supervisord.conf
Error: The directory named as part of the path /var/log/supervisor/archive/info.log does not exist. in section 'program:archive' (file: '/etc/supervisor/conf.d/archive.conf')
For help, use /usr/bin/supervisord -h
或者可能是supervisor服務未啓動
> service supervisor start
配置命令錯誤
參考鏈接: supervisorctl always reports error: ERROR (no such file)
> sudo supervisorctl start archive
archive: ERROR (no such file)
執行下面命令發現報錯
> sudo supervisorctl status
archive FATAL can't find command './archive'
說明supervisor無法解析該指令
解決方法:配置文件執行指令補全
[program:archive]
command=/opt/deploy/archive/archive
...