supervisor遇到的坑

发布在 python

写几条自己用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 的中文编码处理

评论和共享

半自动刷网络课程

发布在 伪技术

刷一个网络课程,很常见的那种,播放视频统计观看时长。不过该系统比较弱,即使切换到别的页面一样也会计算时长。限制条件只是偶尔会出现一些问答题让视频暂停且一个视频播放完成后不会自动播放下一个视频。最开始是打算直接模拟发送http请求,不过后面感觉或许有坑就选了另外一种办法。讲课肯定是有声音的,用程序去捕获声音,如果五秒钟没有声音则认为有问答题出现或者该章节讲完了。

阅读全文

Flask路由机制

发布在 Flask

Flask帅气的Hello World示例让人印象深刻。其中使用装饰器的路由写法功不可没,甚至以前看过一个系列没那么神奇,讲了app.route。是的,它好像并没有那么神奇,我也来解析一下😆

阅读全文

Flask插件原理

发布在 Flask

Flask的插件还挺多,用过的都知道比如flask-sqlalchemy,安装的时候是使用pip install flask-sqlalchemy,使用的时候就成了from flask.ext.sqlalchemy import SQLAlchemy。使用的是flask.ext而不是flask_sqlalchemy。感觉还有点牛掰啊-_-,不过仅仅是看起来高大上,并没有什么卵用。在2016年4月13号正式被移出支持了,已经直接发出不建议使用的警告。本文还是来炒一下现饭,看看它背后的逻辑

阅读全文

tmux

发布在 linux

自screen之后tmux早已身名远扬,然而这个东西对于一般人来说好像并没有什么卵用,好像还比较麻烦。这也是我以前的看法。主要原因就是iterm2已经非常完美了。iterm2的好用一定程度上掩盖了tmux的光辉。因为iterm2是开箱即用,tmux不配置不一定用的舒服。直到某一天我在youtube上看到了2个视频,我知道我该改改了:)
gotbletu_tmux
我个人也是刚入门,下面介绍一些基本知识,希望对读者有所帮助.

阅读全文

fasd和fzf

发布在 linux

来2个日常使用命令行工具玩一玩,前一个是目录快速跳转,后一个是使用curses模糊查找

阅读全文

对于命令行爱好者,很多人会选择将黄金键盘位置CapsLock替换成Ctrl,有些人选择仅仅是和默认的Ctrl进行替换,有些人更极端,相当于去掉CapsLock键增加一个Ctrl位置。我选择后者。有时候会想。假如需要输入大段文字的时候一直按住Shift岂不是蛋疼。搜索了下,网上真有这个问题。而且有人还给出了答案。我就转发一下好了-_-

  • 首先你要知道在你的system preferences→keyboard→modifiers keys是可以修改CapsLock映射
    到Ctrl的
  • 其次使用applescript可以编辑脚本对GUI界面进行操作(系统还自带一个Script Editor,不得不吐槽一下,脚本真不美观)
  • 脚本编写后执行需要到安全设置里面添加许可权限(system preferences→security&privacy→accessibility,由于我使用的是iTerm,将它加入就好了)

最后奉上脚本(添加至~/.zshrc,!!!!仅对英文系统有效,中文估计改一下也能用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
caps () {
osascript > /dev/null <<EOF
tell application "System Preferences"
reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
end tell
tell application "System Events" to tell window 1 of process "System Preferences"
click button 1 of tab group 1
tell sheet 1
tell pop up button 4
click
delay 0.1
if value is "⇪ Caps Lock" then
click menu item 2 of menu 1
log "Change Caps Lock"
else
click menu item 1 of menu 1
log "Restore Caps Lock"
end if
end tell
click button "OK"
end tell
end tell
quit application "System Preferences"
EOF
}

参考

Controlling modifier key behavior via the terminal on mac
Run AppleScript from bash script

评论和共享

首先这是篇水文:),仅记录下这2天使用docker的情况。实际上和docker没什么关系,静态博客嘛,生成之后上传到vps然后上面放个nginx就好了,没什么需要操心的

阅读全文

flask的debug看起来还是很神奇的,可以在异常页面查看当前调用栈,且能够在当前栈内进行交互式会话用以调试。本文将会从python的REPL进行说明并延伸到flask。看看它的具体实现

阅读全文

ficapy

author.bio


author.job


深圳