在VPS上长期运行Python脚本挂机,核心就三件事:让进程活着、把资源管好、别被入侵。 很多脚本跑几天就消失,要么是SSH断开把前台进程带走了,要么是内存爆了被系统OOM Killer干掉,先把基础打牢,挂机才不用天天盯着。
环境选择:VPS长期跑Python脚本用哪个Linux发行版更省心?
Linux发行版选择直接决定后续维护成本,CentOS 7已经停止维护,CentOS Stream的定位偏向滚动更新,不太适合挂机场景。Debian 12和Ubuntu 22.04/24.04 LTS是当前主流选择,软件源稳定、Python 3版本新、社区资料多。
- Debian 12:资源占用低,适合1G内存的小鸡。
- Ubuntu LTS:驱动和软件包更全,遇到问题搜到的解决方案更多。
- 避免用Alpine作为Python挂机环境:musl libc对某些带C扩展的Python库兼容性差。
Python版本管理别直接污染系统环境,系统自带的Python 3通常够用,但强烈建议用venv创建独立虚拟环境,操作路径如下:
mkdir -p /opt/myapp cd /opt/myapp python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
这样做的好处是:升级某个依赖不会影响系统工具,重装系统后迁移也方便,如果不同脚本依赖冲突,可以分别建venv,行业共识认为,虚拟环境是Python部署的基本纪律。
进程保活:VPS挂机Python脚本为什么总被自动杀掉?
挂机脚本突然消失,十有八九是这三类原因:
- SSH会话断开:直接在前台跑
python app.py,SSH一断,进程收到SIGHUP信号就退出。 - 系统OOM Killer:内存超限,Linux内核强制杀进程,
dmesg里能看到Out of memory记录。 - 脚本自己崩了:未捕获异常、网络超时、依赖库bug,导致Python解释器退出。
解决思路很清晰:让脚本脱离SSH会话、由系统托管、崩了自动拉起,首选systemd service,配置简单且开机自启。
创建/etc/systemd/system/myapp.service:
[Unit] Description=My Python App After=network.target [Service] User=youruser WorkingDirectory=/opt/myapp ExecStart=/opt/myapp/venv/bin/python /opt/myapp/app.py Restart=always RestartSec=5 Environment=PYTHONUNBUFFERED=1 [Install] WantedBy=multi-user.target

然后执行:
sudo systemctl daemon-reload sudo systemctl enable --now myapp sudo systemctl status myapp
查看实时日志用journalctl -u myapp -f。Restart=always保证脚本崩溃后5秒自动重启,如果运行多个Python脚本,可以用supervisor,配置文件更灵活,适合批量管理,一个简单的supervisor配置示例:
[program:myapp] command=/opt/myapp/venv/bin/python /opt/myapp/app.py directory=/opt/myapp autostart=true autorestart=true stderr_logfile=/var/log/myapp.err.log stdout_logfile=/var/log/myapp.out.log
临时挂机用tmux或screen,比nohup强在可以随时切回去看输出,但nohup和tmux都不能开机自启,长期挂机还是交给systemd。
资源管控:1G内存VPS跑Python脚本够不够用?
很多人在选配置时纠结这个问题。1G内存的VPS跑普通Python脚本完全够用,前提是别让脚本无节制吃内存,一个简单的爬虫或API轮询脚本,常驻内存通常只有几十到几百MB,但如果用了Selenium、Playwright等浏览器自动化,1G内存会非常紧张,甚至直接触发OOM。
防止内存爆掉,有四个实操步骤:
- 设置swap:1G内存的机器建议再挂1-2G swap,防止瞬时内存尖峰被杀进程。
- 限制systemd资源:在unit文件里加
MemoryMax=800M,超过限制系统会自动重启服务。 - 监控内存占用:用
htop或free -h定期查看,发现内存泄漏及时排查。 - 日志轮转:Python脚本打印日志如果无限增长,磁盘会被写满,用
logrotate管理日志文件。
创建swap的命令:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

logrotate配置示例,放在/etc/logrotate.d/myapp:
/var/log/myapp/.log {
daily
rotate 7
compress
missingok
notifempty
}
业内专家指出,长期挂机的VPS最大的敌人不是CPU性能,而是内存泄漏和磁盘写满,把这两块管好,配置再低也能稳定运行。
网络安全:长期挂机的VPS怎么防入侵?
挂机服务器一旦失守,轻则脚本被篡改,重则变成肉鸡对外发起攻击,安全配置要放在部署第一步。
- SSH只允许密钥登录:编辑
/etc/ssh/sshd_config,设置PasswordAuthentication no,然后重启sshd。 - 修改默认SSH端口:把22改成高位端口,能过滤掉大部分自动化扫描。
- 安装fail2ban:自动封禁暴力破解IP。
sudo apt install fail2ban后基本不用额外配置,默认规则就能挡住大部分攻击。 - 防火墙只留必要端口:
sudo ufw allow 你改后的SSH端口,其他端口按需开放。 - Python依赖安全:
pip install前检查包名是否正确,避免typosquatting恶意包,定期运行pip list --outdated更新关键依赖。
脚本内部也要做好异常处理,不要把数据库密码、API密钥硬编码在代码里,用环境变量或.env文件,配合python-dotenv加载。
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("API_KEY")
这样即使代码泄露,密钥也不会直接暴露。
成本与地域:便宜VPS挂机Python脚本怎么选不踩坑?
价格是挂机玩家最关心的因素之一。便宜VPS挂机Python脚本完全可行,但不要只看价格,超售严重的服务商会导致CPU不稳定、磁盘IO拉胯,国内外的选择也有明显差异:
| 对比项 | 国内VPS | 国外VPS |
|---|---|---|
| 备案要求 | 必须备案 | 无需备案 |
| 访问国内服务 | 延迟低 | 延迟高 |
| 访问境外API | 可能受限 | 通畅 |
| 价格 | 轻量应用服务器较便宜,但带宽小 | 低价促销多,带宽较大 |
如果脚本需要调用OpenAI、Google、GitHub等境外接口,国外VPS更合适,如果脚本访问的是国内电商、社交平台接口,选国内云厂商的轻量应用服务器,配合备案更稳,地域上,国外VPS常用洛杉矶、圣何塞、法兰克福等节点,国内推荐上海、广州、北京。
据统计,多数挂机用户选择1核1G配置作为起步,选择服务商时,多关注网络口碑和退款政策,不要一次买三年,先按月测试稳定性,便宜的VPS促销款往往限制了CPU使用率,购买前仔细看商家标注的“公平使用政策”。
Q&A:VPS挂机Python脚本常见问题
VPS挂机Python脚本内存占用高怎么办?
先定位是内存泄漏还是业务本身需要,用htop按内存排序找到进程,再在Python脚本里用tracemalloc模块输出内存分配热点,如果确认是第三方库泄漏,考虑升级版本或换库,临时方案是配置systemd的MemoryMax限制上限,超限自动重启。
便宜VPS挂机Python脚本稳定吗?
稳定性取决于服务商超售程度和线路质量,低价VPS多数是共享CPU,高峰时段性能会下降,对于CPU占用不高的轮询类脚本,便宜VPS够用,对于需要长时间满载计算的任务,建议选CPU性能有保障的中端配置。
国内VPS跑Python脚本和国外VPS有什么区别?
主要区别在网络可达性和合规要求,国内VPS访问国内网站快,但访问境外服务可能受限,且必须完成ICP备案,国外VPS不需要备案,访问境外API方便,但访问国内服务延迟高,根据脚本要交互的目标服务所在地选择即可。
挂机这事,配置不怕低,就怕没人管,把进程交给systemd、把内存设上限、把SSH锁死,你的Python脚本就能在VPS上安安静静跑上几个月。
