Supervisor進程管家:安裝、配置、實例和報錯問題處理

原文鏈接:https://blog.csdn.net/weixin_44602187/article/details/86598121

本文鏈接:https://blog.csdn.net/weixin_44602187/article/details/86598121
Supervisor是一個進程管理工具

用途就是有一個進程需要每時每刻不斷的跑,但是這個進程又有可能由於各種原因有可能中斷。當進程中斷的時候我希望能自動重新啓動它,此時,我就需要使用到了Supervisor

1、安裝與配置

第一步:安裝supervisor(前提要有python2)

wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz
tar zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
python setup.py install
第二步:創建配置文件

echo_supervisord_conf > /etc/supervisord.conf
第三步:修改配置文件(注意:以下以數字開頭的代表行號,可以直接定位修改)

mkdir /var/log/supervisord/
touch /var/log/supervisord/supervisord.log
vim /etc/supervisord.conf
 12 file=/var/run/supervisor.sock ;socket 路徑,如果不設置,則supervisorctl不能用
 18 [inet_http_server]            ;開啓web頁面服務
 19 port=*:9999                   ;自定義端口號
 20 username=admin                ;認證用戶名,非必須設置項
 21 password=123456               ;認證用戶名密碼,可以直接使用明碼
 23 [supervisord]                 ;定義服務端進程supervisord的相關屬性。必須設置項
 24 logfile=/var/log/supervisord/supervisord.log ;指定supervisord主進程的日誌路徑
 28 pidfile=/var/run/supervisord.pid  ;指定pid路徑, 非必須設置
 48 serverurl=unix:///var/run/supervisor.sock ;supervisorctl連接supervisord,路徑與12行的file一致
 140 [include]                    ;把配置信息寫到多個自定義文件中
 141 files = /root/supervisor-3.1.3/supervisord/*.conf 
1
2
3
4
5
6
7
8
9
10
11
第四步:寫*.conf配置文件(自定義一個簡單的實例)

mkdir /root/supervisor-3.1.3 /supervisord/
vim /root/supervisor-3.1.3 /supervisord/app.conf
[program:app]
command=python /root/app/app.py #執行的命令,如果是程序的話,需要指定在前臺運行
#以上兩條必要,以下都是設置參數非必要
#directory=/root/app/               進入到這個目錄中
#stdout_logfile=/root/app/app.log   成功日誌
#stderr_logfile=/root/app/app.log   錯誤日誌
#user=root                          啓動elasticsearch 的用戶
#numprocs=1                         Supervisor啓動這個程序的多個實例,
#autostart=true                     設置爲隨 supervisord 啓動而啓動
#autorestart=true                   設置爲隨 supervisord 重啓而重啓
#startretries=3                     設置elasticsearch 重啓的重試次數
#priority=1                       權重值,值越低,越早啓動,越晚關閉。默認999
1
2
3
4
5
6
7
8
9
10
11
12
mkdir /root/app/
vim /root/app/app.py
from flask import Flask
app=Flask(__name__)
@app.route('/')
def index():
    return "Hello World"
if __name__=="__main__":
    app.run(port=88)
1
2
3
4
5
6
7
2、測試是否成功

supervisord #初始啓動
supervisorctl #進入交互式
>update #更新conf配置文件
>status #查看狀態
輸出信息:app RUNNING pid 27905, uptime 0:00:03

curl 127.0.0.1:88
輸出信息:Hello World

3、配置各程序的實例(在/root/supervisor-3.1.3 /supervisord/目錄下創建)

實例1:sshd

vim sshd.conf
[program:sshd]
command=/usr/sbin/sshd  -D
1
2
實例2:httpd

vim httpd.conf
[program:httpd]
#管理守護程並使在前臺保持運行
command=/usr/sbin/httpd -DFOREGROUND 
autostary=true
autorestart=true
startretries=3
stdout_logfile=/var/log/supervisord/apache.log
#loglevel=info
1
2
3
4
5
6
7
8
實例3:Nginx
nginx默認以daemon方式啓動的,用supervisord來管理nginx,在配置文件裏添加一行設置daemon off讓nginx以非daemon方式啓動。(supervisord還要求管理的程序是非daemon程序,supervisord會幫你把它轉成daemon程序)。注意添加這一行後Nginx系統(命令)運行就在前臺運行,佔用終端。

vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
daemon off;
events {
1
2
3
vim nginx.conf
[program:nginx]
command=/usr/local/nginx/sbin/nginx
stdout_logfile=/tmp/nginx.log
stderr_logfile=/tmp/nginx.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
priority=55
1
2
3
4
5
6
7
8
9
實例4:Redis

vim redis.conf
[program:redis]
directory=/usr/local/src/redis-2.6.16            
command=/usr/local/src/redis-2.6.16/src/redis-server redis.conf   
stdout_logfile=/tmp/redis_access.log
stderr_logfile=/tmp/redis_error.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
priority=10
1
2
3
4
5
6
7
8
9
10
實例5:java項目(java.jar放到/date/sites/java/目錄下)

vim java.conf
[program:java]
command=java -jar java.jar
directory=/data/sites/java
autostart=true
autorestart=true
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
stderr_logfile=/data/logs/java/err.log
stdout_logfile=/data/logs/java/out.log
stopsignal=INT
redirect_stderr=true
1
2
3
4
5
6
7
8
9
10
11
12
把supervisor加入開機自啓動服務(CentOS7.X系統),利用/etc/rc.local

echo “/usr/bin/supervisord -c /etc/supervisord.conf” >> /etc/rc.local
/etc/rc.local是/etc/rc.d/rc.local的軟連接
如果開機啓動不生效,則首先需要檢查下/etc/rc.d/rc.local是否具有可執行權限

4、supervisor相關命令

supervisord --啓動
supervisorctl reload --修改完配置文件後重新啓動
supervisorctl update --更新有變化的*.conf配置文件
supervisorctl status --查看進程狀態
supervisorctl start 進程名 --啓動XXX進程
supervisorctl stop 進程名 --停止XXX進程
supervisorctl stop all --停止全部進程
supervisorctl #進入交互式,命令與上面相同
5、報錯問題

問題1:

supervisorctl reload
報錯:error: <class ‘socket.error’>, [Errno 111] Connection refused: file: /usr/lib64/python2.7/socket.py line: 224

supervisorctl
報錯:unix:///var/run/supervisor.sock refused connection

報錯原因:supervisor沒有啓動

問題處理:啓動supervisor

supervisord
問題2:

supervisorctl
報錯:httpd BACKOFF Exited too quickly (process log may have details)

supervisor> start httpd
報錯:httpd: ERROR (abnormal termination)

報錯原因:
*.conf配置文件中的’command=/usr/sbin/httpd’寫少了參數

問題處理:
改成:‘command=/usr/sbin/httpd -DFOREGROUND’

問題3:

supervisorctl
報錯:httpd FATAL Exited too quickly (process log may have details)

supervisor> start httpd
報錯:apache: ERROR (abnormal termination)

報錯原因:
supervisord管理的進程必須由supervisord來啓動,supervisord還要求管理的程序是非daemon程序,supervisord會幫你把它轉成daemon程序。linux系統程序已經啓動httpd進程,造成supervisor啓動不了。

問題處理:
systemctl stop httpd 把系統進程停了
supervisorctl start httpd 再啓動

問題4:

supervisorctl
>update
>status
報啓動中:nginx STARTING #(一般報啓動中都是有問題的)

>status
報錯:nginx BACKOFF Exited too quickly (process log may have details)

>start nginx
報錯:nginx: ERROR (abnormal termination)

>status
報錯:nginx FATAL Exited too quickly (process log may have details)

報錯原因:
supervisord管理的程序是非daemon程序(要在前臺運行),nginx默認以daemon方式啓動的。Nginx啓動了,就放在後臺運行了。

問題處理:
在配置文件裏添加一行設置daemon off讓nginx以非daemon方式啓動。

vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
daemon off;
events {

 ———————————————— 
版權聲明:本文爲CSDN博主「褪sεの記憶」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44602187/article/details/86598121

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章