起因
以前,我配置一個服務習慣用
nohup /app/app.sh &
的形式運作,并且添加到/etc/rc.local中,使其可以開機自動啟動。但是一段時間後會發現:
- 程式的輸出隻能儲存到nohup.out檔案中
- nohup.out檔案會越來越大,不會回環
- 停止服務需要找到PID再KILL,如果有多個子程序的話需要找全依次KILL
- 重新開機服務需要先停止服務,再複制nohup運作命執行
- 啟動失敗後不會自動重試運作
- 等等
雖然日志的輸出可以使用管道重定向,日志回環可以使用logrotate,但是太麻煩了,而且配置不集中,維護很麻煩。
supervisord作為一個程序托管程式,包括了目前我遇到的麻煩,而且是配置子產品化,維護相當友善
安裝
安裝很簡單,一般各個Linux發行版本直接可以通過包管理器下載下傳,例:
yum install supervisord
apt-get install supervisord
包管理器安裝的好處就是它會把這個做成服務,不需要手動地在/etc/rc.local啟動檔案中添加啟動代碼,相當友善。
如果無法安裝,可以考慮使用pip來安裝,因為這個是使用python編寫的,且上傳到軟體源了。
手動安裝指令
pip install -U supervisord
如果提示沒有pip這個指令,可以從包管理器中先安裝pip再執行上述指令。
另外,如果是通過包管理器安裝的supervisord,建議再運作一次手動安裝的指令,以便更新到最新版本。
激活服務
chkconfig –add supervisord && chkconfig supervisord on
運作服務
service supervisord start
配置
生成預設配置
使用指令行
echo_supervisord_conf > /etc/supervisord.conf
如果提示指令行沒有找到,可以嘗試下面指令
python -c ‘import supervisor.confecho as t; t.main()’ > /etc/supervisord.conf
主體配置
[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)
[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[include]
files = /etc/supervisord.d/*.conf
上述配置除了最後兩行,其餘都是預設配置,
最後兩行的用途是為了加載配置子產品,這裡我把項目當做子產品來配置
到這裡為止,主體配置已經完成。
項目配置
建立配置檔案到項目目錄,這裡以/myapp1為例,建立/myapp1/daemon.conf
[group:myapp1]
programs=api,web
[program:api]
directory = /myapp1/api
command = bash start.sh
pidfile = /myapp1/api/api.pid
autostart = true # 自動啟動
startsecs = 2 # 啟動後程序在2秒内不退出代表啟動成功,有些項目可能初始化需要好幾分鐘,錯誤可能出現在最後一步,那麼可以調整這個參數
autorestart = true # 啟動失敗後是否自動重新開機
startretries = 3 # 自動重新開機的次數
redirect_stderr = true # 錯誤輸出重定向到标準輸出stdout
stdout_logfile_maxbytes = 50MB # 以最大50MB為限制做日志回環, 到達50MB就寫入到新檔案,舊檔案保留
stdout_logfile_backups = 7 # 舊日志檔案最大保留個數
stdout_logfile = /myapp1/api/api.log
[program:web]
略
制作軟連接配接到配置檔案目錄,這裡全部使用絕對路徑
ln -s /myapp1/daemon.conf /etc/supervisord.d/myapp1.conf
重新整理配置
supervisorctl
supervisor> reread
supervisor> update
supervisor> status
基本操作
# 進入cli
supervisorctl
# 檢視狀态
supervisor> status
# 啟動某個abc程序
supervisor> start abc
# 啟動myapp1程序組
supervisor> start myapp1:*
# 啟動myapp1程序組的api程序
supervisor> start myapp1:api
# 啟動所有程序
supervisor> start *
# 重新開機、停止的文法跟啟動一樣
supervisor> restart XXX
supervisor> stop XXX
# 重新整理配置
supervisor> reread
# 應用配置
supervisor> update
錯誤解決
Error: .ini file does not include supervisorctl section
原因
目前目錄下有supervisord.conf,supervisorctl會優先加載,當時此檔案配置有問題,切換目錄以解決
解決
(cd;supervisorctl)