
我是一个玩了三年多量化的个人玩家,策略不大,跑的是几个自己写的 Python 小策略,一年下来赚个菜钱,图个乐也图个省心。
这篇教程帮你解决的问题很直接:量化程序在云服务器上跑着跑着挂了怎么办? 跟着做完,你会得到一套 Supervisor 进程守护方案——程序崩溃 3 秒内自动拉起、日志自动按天分文件、重启服务器后策略自己跟着开机启动。全程半小时以内搞定。
说实话,在折腾这套东西之前,我的"进程守护方案"是:睡前 ssh 上去看一眼,醒来第一件事摸手机看日志。直到上个月的一个凌晨。
上个月 14 号,周二。我跑的一个均线策略,半夜两点因为一个没捕获的网络异常直接抛栈退出了。
我早上 7 点半醒来看手机,策略群里有人在聊早盘行情,我心里咯噔一下,ssh 上去一看——进程死了 5 个多小时,错过了一波 2% 的行情。按我当时的仓位算,差不多是一顿火锅钱飞了。
更气人的是,这不是第一次。之前在家里的旧笔记本上挂机,断网、断电、Windows 自动更新重启,花样百出。我以为把程序搬上云服务器就万事大吉了,结果发现:服务器是稳了,但程序本身还是会挂的。
我之前的"高可用方案"说出来都丢人:一个
nohup python strategy.py &,外加手机定了三个闹钟,早中晚各上去ps aux | grep python看一眼。程序挂没挂全靠缘分,日志文件一个月长到一个多 G,打开都要卡半天。有次出差在高铁上发现进程没了,用手机的 ssh 客户端敲命令,隧道里信号断断续续,敲了十分钟才把程序拉起来,坐到我对面的大哥看我的眼神像在看特工。
那天晚上我下定决心,把这事儿一次性解决。研究了一圈,方案无非三种:自己写 watchdog 脚本、用 systemd、用 Supervisor。最后选了 Supervisor,原因很简单——配置对 Python 程序最友好,而且我看不懂的那部分 systemd 配置实在是不想学。
先交代下我的环境。之前策略跑在一台吃灰的旧笔记本上,今年过年前后搬到了腾讯云轻量应用服务器,选的 2 核 2G 的 Ubuntu 实例,跑三四个 Python 策略绰绰有余,摊下来一天不到一块钱。
这里说句实话,一开始我是怀疑的——2G 内存跑量化?够吗?结果跑了快半年,内存常年占用 40% 左右,比我那台 16G 内存的笔记本稳得多。笔记本要管微信、管浏览器、管系统更新,服务器就一件事:跑我的策略。
旧体验对比:笔记本挂机那半年,我统计过,非人为中断一共 9 次——3 次 Windows 更新重启、2 次家里跳闸、2 次断网、1 次猫把电源线碰掉了(真的)、1 次不明原因蓝屏。上云这半年,服务器本身的中断次数是:0。剩下的中断全是程序自己抛异常,而这正是 Supervisor 要解决的问题。
上周六上午,泡了杯咖啡,开始折腾。Ubuntu 上装 Supervisor 简单到我以为漏了什么步骤:
sudo apt update
sudo apt install supervisor -y装完它自己就已经开始运行了,而且会跟着系统开机自启。我特意重启了一次服务器验证,systemctl status supervisor 显示 active,踏实了。
对比一下:之前我在笔记本上试过用 Windows 的"任务计划程序"做守护,图形界面点了十几层,又是触发器又是操作又是条件,配了四十多分钟,最后发现程序以 GUI 会话启动,锁屏后行为还不一样。Supervisor 这边,两行命令,两分钟。
Supervisor 的核心就是一个配置文件。我的策略叫 strategy.py,放在 /home/ubuntu/quant/ 下面。我在 /etc/supervisor/conf.d/ 里建了个 quant.conf:
[program:quant-strategy]
command=/home/ubuntu/quant/venv/bin/python /home/ubuntu/quant/strategy.py
directory=/home/ubuntu/quant
user=ubuntu
autostart=true
autorestart=true
startretries=5
stopasgroup=true
stdout_logfile=/home/ubuntu/quant/logs/out.log
stderr_logfile=/home/ubuntu/quant/logs/err.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10几个关键点说一下,都是我验证过的:
command 里我用的是虚拟环境里的 python 绝对路径,别用系统 python,血泪教训,后面讲autorestart=true 是灵魂,进程退出就自动拉起startretries=5 表示启动失败最多重试 5 次,防止程序有致命 bug 时无限重启把 CPU 拉满写完配置,执行:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start quant-strategy然后我做了一件很解压的事:手动把进程杀了。
ps aux | grep strategy # 找到 PID
kill -9 <PID>三秒后 supervisorctl status,状态又回到 RUNNING。那一刻真的有点爽——我故意弄死它,它自己爬起来了。这不就是我要的东西吗。
不是全程顺利。当天晚上我就发现一个怪事:策略明明在跑(status 显示 RUNNING,交易信号也在正常触发),但 out.log 里干干净净,一行日志都没有。
我当时懵了,心想这 Supervisor 是不是有 bug。翻了半天,又开了个测试程序验证,最后查明白了:Python 的 stdout 默认是缓冲输出的,不是行缓冲。程序 print 的东西攒在缓冲区里没写出来,Supervisor 自然收不到。之前 nohup 时代我碰巧没遇到,是因为那会儿我日志全用的 logging 模块直接写文件。
解决办法很简单,两种任选:
-u 参数:python -u /home/ubuntu/quant/strategy.py(-u 就是 unbuffered)environment=PYTHONUNBUFFERED=1我用的第一种,改完 supervisorctl restart quant-strategy,日志哗哗地出来了。
所以这里给大家一个建议:用 Supervisor 管 Python 程序,python -u 这三个字符一定要加上,不然你迟早会在某个深夜对着空日志怀疑人生。
跑起来之后,Supervisor 的管理命令就四个,用了一周就形成肌肉记忆了:
sudo supervisorctl status # 看所有进程状态
sudo supervisorctl restart quant-strategy # 改了代码后重启
sudo supervisorctl tail -f quant-strategy # 实时看日志
sudo supervisorctl stop quant-strategy # 临时停掉(比如调参)现在我的日常是:早上刷牙的时候用手机 ssh 上去看一眼 status,三个策略全是 RUNNING,uptime 十几天,刷牙都刷得安心。
另外 Supervisor 还有个 Web 管理界面可以开,在 /etc/supervisor/supervisord.conf 里把 [inet_http_server] 段打开就行。我开了两天又关了——命令行已经够用,而且多开一个端口多一份暴露面,没必要。
夸完了,挑点刺:
reread + update,只 update 不 reread 是不生效的。这个我踩过,改了配置以为生效了,结果跑的还是旧的。但这些都是边角问题,核心的"崩溃自动重启"做得非常扎实,不影响整体体验。
维度 | 旧方案(nohup + 人肉巡检) | 新方案(云服务器 + Supervisor) |
|---|---|---|
程序挂了怎么办 | 看缘分发现,手动拉起 | 3 秒内自动重启 |
半夜崩溃 | 睡到早上才发现,错过行情 | 自动拉起,策略不中断 |
服务器重启后 | 要手动重新启动程序 | 开机自动拉起 |
日志管理 | 单文件无限膨胀,1 个月 1G+ | 50MB 自动切分,留 10 份 |
每日巡检 | 3 个闹钟,手动 ssh 查看 | 一眼 |
半年非人为中断 | 9 次(笔记本时代) | 0 次服务器中断 |
一句话总结:Supervisor 就是那个 7×24 小时帮你盯着程序的人,而且它不睡觉、不要工资。
如果你也是个人量化玩家,还在用 nohup & 硬扛,我的建议是:放心冲! 一台腾讯云轻量应用服务器 2 核 2G + Supervisor,半小时配完,从此睡觉踏实。
python -u。supervisorctl tail -f 排查问题效率翻倍。资源占用几乎可以忽略,Supervisor 本身常驻内存不到 20MB。Q:Supervisor 和 systemd 哪个好用?
管 Python 脚本我推荐 Supervisor,配置文件语义直白、日志切分开箱即用、改完配置热加载方便。systemd 更适合管理系统级服务。如果你只是要守护几个量化策略,Supervisor 学习成本低得多。
Q:程序崩溃后 Supervisor 会自动重启吗?会不会无限重启?
会自动重启,这就是它的核心功能。通过 startretries=5 可以限制连续启动失败的重试次数,超过就放弃并标记 FATAL,不会无限重启把机器拖死。
Q:2 核 2G 的云服务器能同时跑几个量化策略?
实测跑 3-4 个 Python 策略没问题,内存占用约 40%。Python 量化策略大部分时间在等行情,CPU 压力很小。如果策略里有大周期 K 线计算或者机器学习模型,建议上 2 核 4G。
Q:Supervisor 重启程序后,我怎么知道它重启过?
Supervisor 本身不推送通知。最简单的办法是在你的策略代码启动处加一行 Server 酱或企业微信 webhook 推送,程序每次启动你都会收到微信消息,重启几次一目了然。
Q:服务器重启后,Supervisor 管理的程序会自动启动吗?
会。Supervisor 自身通过 systemctl 设置了开机自启,配置里 autostart=true 的程序会跟着 Supervisor 一起启动,全链路无需人工干预。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。