如果用Python写过线上的后端服务,相信对Supervisor不会陌生,它包含两个主要工具:
1)supervisord: 用来实现进程守护
2)supervisorctl: 用来实现supervisord对其守护进程的控制,如reload配置文件、启/停其守护的子进程,等等
在使用supervisorctl执行如下命令时,
## 其中sup.xxx.conf是supervisord的配置文件
$ supervisorctl -c conf/sup.xxx.conf
偶尔会遇到如下报错:
error: 'socket.gaierror'>, [Errno -2] Name or service not known: file: /home/slvher/python/2.7/lib/python2.7/socket.py line: 553
其中,socket.py第553行代码片段如下:
551 host, port = address
552 err = None
553 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
554 af, socktype, proto, canonname, sa = res
555 sock = None
556 try:
557 sock = socket(af, socktype, proto)
558 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
559 sock.settimeout(timeout)
560 if source_address:
561 sock.bind(source_address)
562 sock.connect(sa)
563 return sock
基础库报错?
于是,在第553行前面增加调试代码,print出host和port的值,发现port居然是”9212;”(其中9212是配置文件sup.xxx.conf中指定的supervisorctl的listen端口)
查看sup.xxx.conf文件,发现在supervisorctl的配置部分,配置serverurl时端口后面直接跟着分号,如下示例:
[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://127.0.0.1:9723; use an http:// url to specify an inet socket
在端口号和注释符;之间加个空格就解决了:
[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://127.0.0.1:9723 ; use an http:// url to specify an inet socket
supervisorctl加载配置文件时,居然没有正确解析出注释符,挖的一手好坑。。。