为什么不能只用 nohup?
在实验室的早期,我也曾是一个 nohup python3 main.py & 的忠实信徒。直到有一天,我的行情接收脚本因为一个未捕获的 NetworkException 悄悄退出了,而我第二天醒来才发现,错过了整整一晚的 Tick 数据。
对于量化交易、FRP 穿透、以及任何 HomeLab 基础设施来说,我们需要的是一个管家,而不仅仅是一个后台运行符。
Systemd 就是这位管家。它能做到:
- 开机自启:服务器重启后自动拉起服务。
- 崩溃重启:程序挂了?它能自动帮你重启 (Restart on failure)。
- 日志管理:不再需要满屏的
output.log,用 journalctl 统一管理。
实战:把 Python 策略变成系统服务
假设我们要部署一个名为 market_maker.py 的做市策略,位于 /home/masiyuan/quant/ 目录下。
1. 编写 Unit 文件
Systemd 的核心配置文件叫做 Unit File,通常放在 /etc/systemd/system/ 目录下,以 .service 结尾。
我们需要创建一个 quant-bot.service:
1
|
sudo nano /etc/systemd/system/quant-bot.service
|
写入以下内容(这是远思实验室的标准模板):
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
27
28
29
30
31
32
33
|
[Unit]
Description=Yuansi Quant Trading Bot
# 依赖关系:确保网络通了再启动,数据库准备好了再启动
After=network.target clickhouse-server.service
[Service]
# 运行用户:千万不要用 root 跑不明脚本!
User=masiyuan
Group=masiyuan
# 工作目录:Python 脚本里读取相对路径文件时以此为准
WorkingDirectory=/home/masiyuan/quant
# 启动命令:必须用绝对路径!
# 建议指向虚拟环境中的 python 解释器
ExecStart=/home/masiyuan/quant/venv/bin/python main.py
# 核心魔法:崩溃后自动重启
Restart=always
# 重启间隔:防止频繁重启导致 CPU 飙升
RestartSec=10s
# 日志输出:直接打到 journald,不需要自己重定向 >> log.txt
StandardOutput=journal
StandardError=journal
# 环境变量 (可选)
Environment="API_KEY=sk_live_xxxxxx"
Environment="PYTHONUNBUFFERED=1"
[Install]
# 运行级别:多用户模式(类似于 Windows 的正常启动)
WantedBy=multi-user.target
|
###2.激活与运行
写好配置文件后,需要通知Systemd 重载配置:
1
|
sudo systemctl daemon-reload
|
然后就是素质三连:
1
2
3
4
5
6
|
# 设置开机自启
sudo systemctl enable quant-bot
# 立即启动
sudo systemctl start quant-bot
# 查看状态(最常用)
sudo systemctl status quant-bot
|
如果看到绿色的Active:active
(running),恭喜你,你的策略已经拥有了“不死之身”。
##进阶:像侦探一样查日志
程序跑起来了,但如果报错了去哪看?别再去翻那个几百MB的nohup.out了。
journalctl是Systemd的日志查看工具,功能极其强大:
1
2
3
4
5
6
7
8
9
|
#1,实时查看日志 (类似tail -f)
journalctl -u quant-bot - f
# 2,查看最近50行
journalctl -u quant-bot -n 50
# 3,只看今天的日志
journalctl -u quant-bot --since
"today"
# 4,只看报错信息(Error级别)
journalctl -u quant-bot -p err
|