GitLab CI实现VPS上Python脚本常驻运行并正常退出流水线
解决GitLab CI流水线卡住同时保持Python脚本常驻运行的问题
直接执行python3 main.py会让SSH会话持续挂起,导致GitLab CI流水线一直处于运行状态无法正常结束。借助tmux创建后台会话可以完美解决这个问题:SSH命令执行完成后立即退出,流水线正常结束,同时Python脚本会在VPS的tmux会话中持续运行,直到下一次流水线执行时被重启。
修改后的CI脚本
script: - 'apt-get update -y && apt-get install openssh-client -y && apt-get install sshpass -y ' - sshpass -p "$VPS_PASSWORD" ssh -o StrictHostKeyChecking=no root@host " # 若VPS未安装tmux则自动安装(可根据实际情况移除) apt-get install tmux -y || true && cd repo/ && git pull && # 终止旧的Python应用会话,避免多进程冲突 tmux kill-session -t python_app 2>/dev/null || true && # 创建后台tmux会话启动脚本,输出重定向到日志文件 tmux new-session -d -s python_app 'python3 main.py >> app.log 2>&1' "
关键命令说明
tmux kill-session -t python_app 2>/dev/null || true:强制终止名为python_app的tmux会话,即使会话不存在也不会报错。这样每次流水线执行时都会重启脚本,确保运行的是最新代码。tmux new-session -d -s python_app 'python3 main.py >> app.log 2>&1':-d:后台创建会话,不主动连接,让SSH命令可立即结束-s python_app:给会话命名,方便后续管理>> app.log 2>&1:将脚本的标准输出和错误输出重定向到日志文件,便于后续排查问题
额外优化建议
- 安全存储密码:不要在脚本中明文写密码,将VPS密码存入GitLab项目的「CI/CD变量」中,用
$VPS_PASSWORD引用,避免密码泄露。 - 提前安装依赖:如果VPS是固定使用的,建议提前在VPS上安装好tmux、Python等依赖,减少CI脚本的执行时间。
- 验证会话状态:若需要确认脚本是否启动成功,可在命令末尾添加
tmux list-sessions来检查会话是否创建。
内容的提问来源于stack exchange,提问作者Kevin A.
相关产品推荐
相关产品推荐

