背景
我们在linux服务器上部署模型或者一个长期运行的程序的时候,通常使用的是nohup
方法,因为nohup真的非常简单,只需要一行命令即可,但是nohup不好的地方就在于无法监控,并且无法自动中断重启,如果我们要查看一个nohup的程序是否在运行,需要每次输入ps -aux | grep "运城程序"
才可以,比较繁琐,因此这里就推荐超好用的supervisor定时管理服务,并介绍一下他的核心用法,可以轻松上手
初次安装
由于supervisor在服务器上已经安装好了,等下次有机会自己安装的时候再更新~
3步完成部署
首先介绍一下supervisor的安装路径,通常会安装在/etc/
下面,在/etc/supervisord.conf
文件的最下面,我们可以看到supervisor的加载文件路径,这个路径是可以更改的
[include]
files =/etc/supervisord.d/*.ini
知道加载文件的路径后,咱们就可以开始部署程序了
- 编写
.ini
文件,格式如下
[program:deploy]
process_name=%(program_name)s
command= /home/venv/bin/python /home/python/deploy_api.py
directory= /home/python/
environment=PYTHONPATH=/home/
stdout_logfile=/home/logs/deploy.log
stderr_logfile=/home/logs/deploy.log
numprocs=1
numprocs_start=0
autostart=true
autorestart=true
- program: deploy,这里的deploy决定了在supervisor中显示的名字,不同与其他重名
- command: 第一个命令为python所在目录,第二个命令为想要运行的程序(这是以python进行距离,如果是java等其他一样)
- directory: 项目目录,不一定非得是运行程序的上级
- enviroment: 在这里是python环境的上级,anaconda也是类似的
- stdout_logfile: 是输出的记录
- stderr_logfile: 是错误的记录
- numprocs: 运行的进程数
- numprocs_start: 开始进程的编号
- autostart: 是否自动启动
- autorestart: 是否自动重启
- 在写
.ini
文件保存后,我们可以直接在centos上运行supervisorctl update
进行更新,在ubuntu上可能得加上sudo - 然后我们在命令行上输入
supervisorctl
就可以看到咱们的程序名字出现了,如果显示RUNNING那就代表程序正常运行了
注意点
- ini文件中最好不要写中文注释,可能会导致ini文件无法运行
- 要使用对应环境的python去运行,ini文件必须写对,不然会出现spawn error
其他语法
sudo supervisorctl shutdown
可以关闭supervisor- 重启命令
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl reload
重新加载所有supervisor定时命令,在多人合作时最好不要用- 在
supervisorctl
命令行中,输入status
刷新状态
需要控制环境变量时
在某些时候,我们运行python程序时,需要控制系统环境变量,例如:
LD_PRELOAD=./jemalloc-5.3.0/lib/libjemalloc.so python app.py
这种情况下,supervisor中的command便不能直接将环境变量加在前面,这种情况我们可以写一个shell脚本
LD_PRELOAD=/home/deploy/ps/workdir/jemalloc-5.3.0/lib/libjemalloc.so /home/deploy/anaconda3/envs/torch/bin/python /home/deploy/ps/workdir/deploy_api.py
然后将.ini
文件的command改成
command=bash run_image_feature_api.sh
2023.4.26 更新
- 这次在ubuntu服务器上配置supervisor,踩了很多坑,首先是文件的目录位置是不一样的,与centos配置文件保存在
/etc/supervisord.d/
中不同,ubuntu是保存在/etc/supervisor/conf.d/
,并且配置文件的后缀为.conf
而并非是.ini
unix:///var/run/supervisor.sock no such file
,这个是缺少文件,需要创建sudo touch /var/run/supervisor.sock
,同时需要赋予修改权限,sudo chmod 777 /var/run/supervisor.sock
unknown error making dispatchers for ‘etcd‘: EACCES
,这个问题是成功运行supervisord
之后,运行sudo supervisorctl
出现的,其原因是因为log文件没有修改权限导致的,因此我们需要对log文件增加权限,找到配置文件中设定的stderr文件和stdout文件所在位置,运行sudo chmod 777 log_files
就可以了
2024.2.22更新
本次重启服务器,又遇到了unix:///var/run/supervisor.sock no such file
问题,这次使用sudo service supervisord restart
便解决了问题