非root权限下部署supervisord
为了开发的方便,我在服务器自己的账号路径下创建了一个独立的Python环境,通过在.bash_profile设置alias别名替换掉python指令。
1 | alias python="/home/bigdata/env/python/bin/python2.7" |
近期有个Tornado项目部署上去了,需要做进程守护,我自然想到了supervisord这个神器。
以前都是在root权限下安装的,非root还是第一次。
安装
1 | pip install supervisord |
设置别名
1 | alias supervisord="/home/bigdata/env/python/bin/supervisord" |
从模板恢复标准配置
1 | echo_supervisord_conf > supervisord.conf |
标准配置中加入待守护程序
1 | [program:query_server] |
注意:user必须是你当前的账号
用非daemon模式测试一下
1 | supervisord -n -c supervisord.conf |
出现「exit status 1; not expected on loop」的错误,查stderr日志定位是tornado.ioloop的依赖包不存在,于是猜想是不是Python的别名在supervisord中不起作用的原因。
把配置文件中的python替换成绝对路径,完美解决。
重载
当程序或配置发生变化时,一般通过
1 | supervisorctl reload |
来重载整个守护。但因为我们是非root安装的,默认的/etc/supervisor/supervisord.conf并没有被创建,所以我们必须告诉supervisorctl配置文件的具体路径,否则会报错:
error: <class ‘socket.error’>, [Errno 97] Address family not supported by protocol: file: /home/bigdata/env/python/lib/python2.7/socket.py line: 571
加上-c就可以了:
1 | supervisorctl -c /explicit/path/to/config/file/echoed/out/supervisord.conf reload |