配置基于 virtualenv 的 supervisor
2014年8月23日

本文写于 2014 年,面向当时常见的 Python 2.x 系统环境与 virtualenv。如今更常见的是
venv/ Poetry / uv 等工具链,配置项名称请以当前 supervisor 文档为准。
supervisor 是基于 Python 的任务管理工具,用来自动运行各种后台任务。当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。
virtualenv 是 Python 的一个虚拟环境管理工具,用来部署运行不同的 Python 版本。很多 Linux 发行版本的 Python 都是 2.x,例如要运行 3.x 版本的 Python 程序,如果直接升级系统的 Python 版本的话,由于 Python 3.x 无法向前兼容 2.x 版本会造成系统依赖失效。
安装配置 virtualenv
推荐直接用 pip 安装:
pip install virtualenv如果系统未安装 pip,可从 PyPI virtualenv 下载对应版本的源码包后安装,例如:
curl -O https://files.pythonhosted.org/packages/source/v/virtualenv/virtualenv-20.26.2.tar.gz
tar xvfz virtualenv-20.26.2.tar.gz
cd virtualenv-20.26.2
python setup.py install(版本号请按发布时的最新版替换。)
在项目目录下通过以下命令初始化和激活虚拟环境:
virtualenv ENV
cd ENV
source bin/activate安装配置 supervisor
pip install supervisorUbuntu Server 上可直接 apt-get 安装:
sudo apt-get install supervisor通过以下命令生成 supervisor 示例配置文件:
echo_supervisord_conf > /etc/supervisord.conf修改 supervisord.conf 文件,通过添加 [program:name] 来新建一个任务,例如:
[program:tornado]
directory=/home/user/website/example.com
command=python server.py
autorestart=true
stdout_logfile=/var/log/example.com/out.log
stderr_logfile=/var/log/example.com/err.log但我们利用了 virtualenv 来生成了不同的虚拟环境,这里的 command 直接是 python server.py 肯定会出错,所以我们需要改成这样:
[program:tornado]
directory=/home/user/website/example.com
command=/home/user/website/example.com/ENV/bin/python server.py
autorestart=true
stdout_logfile=/var/log/example.com/out.log
stderr_logfile=/var/log/example.com/err.log接下来运行以下命令启动 supervisor 服务:
supervisord -c /etc/supervisord.conf
supervisorctl start tornado重载 supervisor 里的任务可运行:
supervisorctl restart tornado