非root权限下部署supervisord

为了开发的方便,我在服务器自己的账号路径下创建了一个独立的Python环境,通过在.bash_profile设置alias别名替换掉python指令。

1
2
3
alias python="/home/bigdata/env/python/bin/python2.7"
alias pip="/home/bigdata/env/python/bin/pip"
alias easy_install="/home/bigdata/env/python/bin/easy_install"

近期有个Tornado项目部署上去了,需要做进程守护,我自然想到了supervisord这个神器。
以前都是在root权限下安装的,非root还是第一次。

安装

1
pip install supervisord

设置别名

1
2
3
alias supervisord="/home/bigdata/env/python/bin/supervisord"
alias supervisorctl="/home/bigdata/env/python/bin/supervisorctl"
alias echo_supervisord_conf="/home/bigdata/env/python/bin/echo_supervisord_conf"

从模板恢复标准配置

1
echo_supervisord_conf > supervisord.conf

标准配置中加入待守护程序

1
2
3
4
5
6
7
[program:query_server]
command=python runserver.py
directory=/home/bigdata/server/UserModelQueryServer
autorestart=true
user=bigdata
stdout_logfile=/home/bigdata/server/UserModelQueryServer/supervisord_stdout.log
stderr_logfile=/home/bigdata/server/UserModelQueryServer/supervisord_stderr.log

注意: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