天天看點

supervisord上手與配置起因安裝配置基本操作錯誤解決

起因

以前,我配置一個服務習慣用

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)

繼續閱讀