記錄 CentOS 伺服器開啟 Supervisor 管理佇列任務

lxzoliver發表於2020-03-03

伺服器配置:centos7.2

記錄搭建Supervisor

Supervisor簡介

Supervisor是用Python開發的一套通用的程式管理程式,能將一個普通的命令列程式變為後臺daemon,並監控程式狀態,異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的程式當作supervisor的子程式來啟動,這樣只要在supervisor的配置檔案中,把要管理的程式的可執行檔案的路徑寫進去即可。也實現當子程式掛掉的時候,父程式可以準確獲取子程式掛掉的資訊的,可以選擇是否自己啟動和報警。supervisor還提供了一個功能,可以為supervisord或者每個子程式,設定一個非root的user,這個user就可以管理它對應的程式。

安裝Supervisor

安裝:yum install supervisor

修改配置檔案:vi /etc/supervisord.conf

配置檔案內容如下:

[unix_http_server]
file=/var/run/supervisor.sock   ; UNIX socket 檔案,supervisorctl 會使用
;chmod=0700                 ; socket 檔案的 mode,預設是 0700
;chown=nobody:nogroup       ; socket 檔案的 owner,格式: uid:gid

;[inet_http_server]         ; HTTP 伺服器,提供 web 管理介面
;port=127.0.0.1:9001        ; Web 管理後臺執行的 IP 和埠,如果開放到公網,需要注意安全性
;username=user              ; 登入管理後臺的使用者名稱
;password=123               ; 登入管理後臺的密碼

[supervisord]
logfile=/var/run/supervisord.log ; 日誌檔案,預設是 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 日誌檔案大小,超出會 rotate,預設 50MB
logfile_backups=10           ; 日誌檔案保留備份數量預設 10
loglevel=info                ; 日誌級別,預設 info,其它: debug,warn,trace
pidfile=/var/run/supervisord.pid ; pid 檔案
nodaemon=false               ; 是否在前臺啟動,預設是 false,即以 daemon 的方式啟動
minfds=1024                  ; 可以開啟的檔案描述符的最小值,預設 1024
minprocs=200                 ; 可以開啟的程式數的最小值,預設 200

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; 通過 UNIX socket 連線 supervisord,路徑與 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通過 HTTP 的方式連線 supervisord

; 包含其他的配置檔案
[include]
files = supervisord.d/*.ini    ; 可以是 *.conf 或 *.ini

通過新增配置檔案,加入需要管理的任務:

vi /etc/supervisord.d/horizon.ini

新增內容如下:

[program:horizon] //專案名
process_name=%(program_name)s
command=php /your_project/artisan horizon //指令碼需要執行的命令
autostart=true  //supervisor啟動的時候是否隨著同時啟動,預設True
autorestart=true //程式異常退出後自動重啟
user=root // 哪個使用者啟動
redirect_stderr=true //把 stderr重定向到stdout,預設false
stdout_logfile=/your_project/horizon.log //記錄日誌

常見Supervisor命令

開機自啟:systemctl enable supervisord

啟動supervisord:systemctl start supervisord

檢視狀態:systemctl status supervisord

重新啟動配置中的所有程式:supervisorctl reload

檢視程式是否執行:ps -ef|grep supervisor

部分內容參考使用Supervisor管理任務

踩坑

  1. 初次執行supervisor時程式報錯
    記錄 CentOS 伺服器開啟 Supervisor 管理任務

通過systemctl status supervisord.service命令檢視報錯詳情如下:

記錄 CentOS 伺服器開啟 Supervisor 管理任務

通過錯誤資訊可以看出,user名稱未定義

在配置horizon.ini時,我是直接複製教程上面的命令所以在執行時,不存在forge使用者,所以程式報錯,我在這裡將其修改成root使用者

2.在執行php artisan horizon命令時,程式報錯

記錄 CentOS 伺服器開啟 Supervisor 管理任務

報錯原因是php禁用了pcntl_signal(),pcntl_alarm()函式

通過php –ini檢視php.ini配置檔案,編輯找到disable_functions,將其中的pcntl_signal去掉,並重新啟動php就可以正常執行了

對於pcntl_signal()函式暫未研究過,相關資訊可參考官方文件,後續研究

在處理完成以上錯誤後,重啟Supervisor,並執行systemctl status supervisord命令,如下圖所示,則程式啟動成功!

記錄 CentOS 伺服器開啟 Supervisor 管理佇列任務

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章