写几条自己用supervisor遇到的一些小坑

  1. Python 3 Wall的反派代表,一直不能使用python3安装
  2. 对中文输出支持奇差,估计是使用python2造成的,举个例子,假如你要在python2里面print输出一个unicode中文字符。我试了各种办法,均无解(和supervisor使用子进程运行程序的策略有关),好在使用logging模块输出中文居然没啥问题-_-,正式运行环境也是全部使用logging代替print
  3. 即使用python3,输出中文也会遇到问题,需要在配置文件添加environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"解决
  4. 写配置文件的时候一个变量不能配置多行,我一开始因为environment太长。写了2行,导致后面的没生效,折腾好久
  5. 修改supervisor配置文件后,如果配置文件错了,不会报错!而且supervisor没有工具能对配置文件的正确性进行检查,灰常操蛋啊!
  6. supervisor可以检查到异常自动重启并设置最大重启次数,可是有时候会造成无限重启这种情况。因为重启后立刻退出才会触发最大重启次数机制,假如程序一直是运行了十分钟自动退出。那么会造成无限重启,可以使用它的api写一个脚本监控这种情况,进行警告
1
2
3
4
5
6
7
8
9
10
11
import xmlrpc.client

def list_time(name: str, interval: int, times: int):
s = xmlrpc.client.ServerProxy('http://localhost:9001')
if s.supervisor.getProcessInfo(name).get('statename') != 'RUNNING':
return False
context = s.supervisor.readLog(0, 10 * 1024 * 100)
context = filter(lambda x: name in x and 'spawn' in x, context.splitlines())
context = map(lambda x: datetime.strptime(x[:19], '%Y-%m-%d %H:%M:%S'), context)
context = list(filter(lambda x: x + timedelta(minutes=interval) > datetime.now(), context))
return (len(context) > times) and len(context)

参考

也谈 Python 的中文编码处理