supervisor用于守护进程,在进程意外终止后将其重启。
supervisor没有监听内部程序和自动重启的功能。
Python-3.9.5安装
第一步,检查Linux系统是否自带Python。
命令:python --version
第二步,安装依赖包。
命令:yum -y install bzip2-devel gcc make ncurses-devel openssl-devel readline-devel sqlite-devel tk-devel zlib-devel
第三步,下载Python-3.9.5安装包。
登录Python官网:Python Source Releases | Python.org,或登录Python下载网址:https://www.python.org/downloads/release/python-395/下载Python-3.9.5中的“Gzipped source tarball”和“XZ compressed source tarball”。也可以使用wget命令下载。
命令:cd /usr/local/src
wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
第四步,解压Python-3.9.5安装包。
命令:cd /usr/local/src
tar -xvJf Python-3.9.5.tar.xz
第五步,编译安装Python-3.9.5。
命令:cd /usr/local/src/Python-3.9.5
./configure prefix=/usr/local/Python-3.9.5
make && make install
若结果显示下图的内容,则说明Python-3.9.5编译安装成功。
第六步,配置Python环境变量。
在配置文件/etc/profile中添加下面的代码:
export PATH=$PATH:/usr/local/Python-3.9.5/bin
# 使profile配置立即生效
命令:source /etc/profile
# 查看Python版本
命令:python3.9 -V
若结果显示“Python 3.9.5”,则说明Python-3.9.5安装成功。
pip安装
第一步,检查Python3是否自带pip。
命令:pip3 --version
若结果显示“pip 9.0.3”,则说明Python3自带pip。
第二步,更新pip。
命令:sudo pip3 install --upgrade pip
若结果显示“Successfully installed pip-21.1.1”,则说明pip更新成功。
第三步,查看更新的pip版本。
命令:python3.9 -m pip -V
supervisor安装和配置
第一步,利用pip安装supervisor。
命令:pip install supervisor
若结果显示“Successfully installed supervisor-4.2.5”,则说明supervisor安装成功。
第二步,创建Supervisor配置目录。
命令:mkdir -p /etc/supervisor/conf.d
mkdir -p /var/log/supervisor/test
mkdir -p /run/supervisor
第三步,在/etc/supervisor目录中创建主进程supervisord.conf文件。
命令:vim /etc/supervisor/supervisord.conf
在supervisord.conf文件中添加下面的代码:
; Sample supervisor config file.
[unix_http_server]
; (the path to the socket file)
file = /var/run/supervisor/supervisor.sock
; chmod=0700 ; sockef file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; (ip_address:port specifier, 0.0.0.0:port for all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
[supervisord]
; (main log file;default $CWD/supervisord.log)
logfile = /var/log/supervisor/supervisord.log
; (max main logfile bytes b4 rotation;default 50MB)
logfile_maxbytes = 50MB
; (num of main logfile rotation backups;default 10)
logfile_backups = 10
; (log level;default info; others: debug,warn,trace)
loglevel = info
; (supervisord pidfile;default supervisord.pid)
pidfile = /var/run/supervisord.pid
; (start in foreground if true;default false)
nodaemon = false
; (min. avail startup file descriptors;default 1024)
minfds = 1024
; (min. avail process descriptors;default 200)
minprocs = 200
; umask=022 ; (process file creation umask;default 022)
;user=chrism ; (default is current user, required if root)
;identifier=supervisor ; (supervisord identifier, default is 'supervisor')
;directory=/tmp ; (default is not to cd during start)
;nocleanup=true ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value ; (key value pairs to add to environment)
;strip_ansi=false ; (strip ansi escape codes in logs; def. false)
; 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/supervisor.sock ; use a unix:// URL for a unix socket
[program:test]
command = php think test
stdout_logfile = /var/log/supervisor/test/stdout.log
stderr_logfile = none
process_name = %(program_name)s-%(process_num)d
numprocs = 10
priority = 999
autostart = true
autorestart = true
exitcodes = 0,2
startsecs = 3
startretries = 3
stopsignal = TERM
stopwaitsecs = 10
directory = /data/websocket/sites/xxxxxx.com/www/
user = root
stdout_logfile_maxbytes = 0
stdout_logfile_backups = 10
stderr_logfile_maxbytes = 0
stderr_logfile_backups = 10
[program:guzzle]
command = php think guzzle
stdout_logfile = /var/log/supervisor/guzzle.log
stderr_logfile = none
process_name = %(program_name)s-%(process_num)d
numprocs = 10
priority = 999
autostart = true
autorestart = true
exitcodes = 0,2
startsecs = 3
startretries = 3
stopsignal = TERM
stopwaitsecs = 10
directory = /data/websocket/sites/xxxxxx.com/www/
user = root
stdout_logfile_maxbytes = 0
stdout_logfile_backups = 10
stderr_logfile_maxbytes = 0
stderr_logfile_backups = 10
[program:temp]
command = php think temp
stdout_logfile = /var/log/supervisor/temp.log
stderr_logfile = none
process_name = %(program_name)s-%(process_num)d
numprocs = 10
priority = 999
autostart = true
autorestart = true
exitcodes = 0,2
startsecs = 3
startretries = 3
stopsignal = TERM
stopwaitsecs = 10
directory = /data/websocket/sites/xxxxxx.com/www/
user = root
stdout_logfile_maxbytes = 0
stdout_logfile_backups = 10
stderr_logfile_maxbytes = 0
stderr_logfile_backups = 10
[program:supervisor-web]
command = /usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf
autostart = true
autorestart = true
user = root
supervisor启动主进程
第一步,根据supervisord.conf文件位置来启动supervisorctl。
命令:/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep supervisor
第二步,让主、子进程配置文件的修改生效。
命令:/usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf
supervisor> reload
supervisor> update
或 supervisorctl reload
supervisorctl update [processname]
第三步,重启supervisor服务。
修改环境变量之后需要重启supervisor才会生效
命令:/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
#重启子进程
命令:supervisorctl restart [processname]
#重启所有程序
命令:supervisorctl restart all
#停止子进程
命令:supervisorctl stop [processname]
#停止所有程序
命令:supervisorctl stop all
#启动子进程
命令:supervisorctl start [processname]
#启动所有
命令:supervisorctl start all
第四步,查看supervisor log。
命令:supervisorctl tail -f [processname]
遇到的问题
1、启动supervisor服务
命令:/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
若结果显示“Error: Cannot open an HTTP server: socket.error reported errno.ENOENT (2)”,则只需要执行命令“mkdir -p /run/supervisor”,然后再次执行一下上面的命令即可。
若结果显示“Unlinking stale socket /var/run/supervisor/supervisor.sock”,则只需要执行命令“unlink /var/run/supervisor/supervisor.sock”,然后杀死supervisord进程,最后再次执行一下上面的命令即可。
若结果显示“Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.”,则只需要杀死supervisord进程,然后再次执行一下上面的命令即可。