如何让Python脚本在GCP VM上持续稳定运行?
排查与解决GCP VM上Python脚本意外终止的问题
一、先明确终止原因(关键第一步)
- 查看系统日志:在GCP VM上查看
/var/log/syslog或执行journalctl命令,排查是否存在内存不足被系统终止(OOM killer)的记录,或是进程崩溃的系统级日志。 - 给脚本添加详细日志:用Python的
logging模块把运行日志写入文件,覆盖关键逻辑节点,方便事后排查:import logging logging.basicConfig( filename='script_runtime.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) # 关键步骤插入日志 logging.info("开始处理用户输入请求") - 改用带日志记录的启动方式:之前直接用
python3 script.py启动,断开SSH会话后进程可能被终止,且无输出留存。换成nohup python3 script.py > script_output.log 2>&1 &,将标准输出和错误输出都写入日志,同时让进程在后台持续运行。
二、常见问题及对应解决方法
1. SSH会话断开导致进程终止
- 问题根源:直接通过SSH启动脚本,断开会话时进程会收到SIGHUP信号被终止。
- 解决:
- 用
nohup后台启动:如上述nohup python3 script.py > script_output.log 2>&1 & - 用会话管理工具:启动
tmux或screen,在会话内运行脚本;断开SSH后重新连接时,用tmux attach或screen -r恢复会话。
- 用
2. 内存泄漏或资源耗尽
- 问题根源:脚本长时间运行后内存占用持续升高,触发系统OOM killer强制终止进程(系统日志会有
Out of memory: Killed process记录)。 - 解决:
- 排查代码内存占用:用
memory_profiler工具分析,安装后执行python -m memory_profiler script.py,定位内存占用过高的代码段,清理未及时释放的对象或全局变量。 - 升级VM配置:若业务确实需要更多资源,在GCP控制台调整VM的机器类型,提升内存或CPU配额。
- 排查代码内存占用:用
3. 未捕获异常导致崩溃
- 问题根源:脚本运行中遇到异常(如网络超时、输入格式错误),未用
try-except捕获,直接触发崩溃。 - 解决:
- 关键代码块加异常捕获:在外部API调用、文件操作、用户输入处理等环节添加捕获逻辑,并记录详细错误日志:
try: # 示例:调用外部API response = requests.get("https://example.com/api") response.raise_for_status() except Exception as e: logging.error(f"API调用失败: {str(e)}", exc_info=True) # 可选:处理异常后继续运行,避免脚本终止 - 顶层全局异常捕获:在脚本入口处添加全局捕获,防止未预见的异常导致崩溃:
def main(): # 脚本主逻辑 pass if __name__ == "__main__": try: main() except Exception as e: logging.critical(f"脚本意外终止: {str(e)}", exc_info=True)
- 关键代码块加异常捕获:在外部API调用、文件操作、用户输入处理等环节添加捕获逻辑,并记录详细错误日志:
4. GCP VM系统维护或自动重启
- 问题根源:GCP会定期对VM进行内核更新等维护操作,可能导致实例重启,脚本随之终止。
- 解决:
- 查看GCP控制台实例操作日志,确认是否存在自动重启记录。
- 设置脚本开机自启:将脚本注册为
systemd服务,VM重启后自动恢复运行。示例配置文件/etc/systemd/system/script.service:[Unit] Description=Python Script Service After=network.target [Service] User=your_username WorkingDirectory=/path/to/script/directory ExecStart=/usr/bin/python3 script.py Restart=always # 进程终止时自动重启 RestartSec=5 [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable script.service sudo systemctl start script.service
5. 外部依赖连接中断
- 问题根源:脚本依赖的数据库、API长时间连接后断开,未实现重连逻辑导致崩溃。
- 解决:
- 数据库连接添加重连机制:检测连接状态,断开时自动重新建立连接。
- API调用增加重试逻辑:用
tenacity等工具实现自动重试,处理超时和连接错误。
内容的提问来源于stack exchange,提问作者Nani
相关产品推荐
相关产品推荐

