0

0

如何在 GCP 虚拟机上持久化运行 Python 脚本(支持交互式输入)

花韻仙語

花韻仙語

发布时间:2026-02-22 17:45:15

|

743人浏览过

|

来源于php中文网

原创

如何在 GCP 虚拟机上持久化运行 Python 脚本(支持交互式输入)

本文介绍在 google cloud platform(gcp)虚拟机上实现 python 脚本长期稳定运行的可靠方案,重点解决因终端断开、会话超时或进程意外退出导致脚本中断的问题,并兼顾需交互式输入(如 input())的特殊场景。

本文介绍在 google cloud platform(gcp)虚拟机上实现 python 脚本长期稳定运行的可靠方案,重点解决因终端断开、会话超时或进程意外退出导致脚本中断的问题,并兼顾需交互式输入(如 input())的特殊场景。

在 GCP VM 上直接执行 python3 script.py 是典型的前台交互式运行方式——它依赖当前 SSH 会话的生命周期。一旦网络中断、终端关闭或 SSH 连接超时(默认通常为数小时),Shell 会向子进程发送 SIGHUP 信号,导致脚本立即终止。这正是您观察到“运行几小时后自动退出”的根本原因。而 PythonAnywhere 等托管平台对交互式 I/O 和资源的限制,进一步凸显了在自有 GCP VM 上构建健壮守护机制的必要性。

✅ 推荐方案:使用 systemd 实现进程守护(含交互支持)

虽然 systemd 默认以无终端(no TTY)方式运行服务,但可通过合理配置支持需要标准输入/输出的 Python 脚本。以下是经过验证的完整实践流程(以 Ubuntu 20.04+/Debian 11+ 为例):

1. 准备脚本与环境

确保您的脚本逻辑已适配后台运行。例如,避免无限阻塞在 input() 而无超时机制。推荐添加基础健壮性处理:

# script.py
import sys
import time

def main():
    print("✅ Python 服务已启动,等待用户输入...")
    while True:
        try:
            # 使用 sys.stdin.readline() 替代 input(),便于 systemd 控制
            user_input = sys.stdin.readline().strip()
            if not user_input:
                print("⚠️  输入为空,继续监听...")
                continue
            print(f"? 收到输入: '{user_input}' → 处理中...")
            # 此处插入您的业务逻辑
            time.sleep(1)  # 模拟处理延迟
        except (EOFError, KeyboardInterrupt):
            print("? 收到终止信号,正在安全退出...")
            break
        except Exception as e:
            print(f"❌ 运行异常: {e}")
            time.sleep(2)

if __name__ == "__main__":
    main()

2. 创建 systemd 服务单元文件

创建服务定义(需 root 权限):

AI Home Tab
AI Home Tab

把你喜欢的AI放到首页

下载

立即学习Python免费学习笔记(深入)”;

sudo nano /etc/systemd/system/myscript.service

内容如下(关键点已注释):

[Unit]
Description=My Persistent Python Script
After=network.target

[Service]
Type=simple
User=your-username          # 替换为实际非 root 用户(推荐!)
WorkingDirectory=/home/your-username/myproject
ExecStart=/usr/bin/python3 /home/your-username/myproject/script.py
Restart=always
RestartSec=5
StandardInput=tty-force     # ⚠️ 核心:强制分配伪终端(PTY)
StandardOutput=journal+console
StandardError=journal+console
TTYPath=/dev/tty1           # 指定关联的 TTY(可选,增强兼容性)
TTYReset=yes
TTYVHangup=yes
# 若需从外部写入输入,可启用此行并配合 'systemd-run --scope' 或命名管道
# StandardInput=pipe

[Install]
WantedBy=multi-user.target

? 为什么 StandardInput=tty-force 至关重要?
它让 systemd 为服务分配一个伪终端(PTY),使 sys.stdin.readline() 能持续读取,而非因 stdin 关闭立即抛出 EOFError。这是支持交互式输入的底层保障。

3. 启用并启动服务

# 重载配置
sudo systemctl daemon-reload

# 启用开机自启
sudo systemctl enable myscript.service

# 立即启动
sudo systemctl start myscript.service

# 查看实时日志(验证是否正常运行)
sudo journalctl -u myscript.service -f

4. (可选)向运行中的脚本发送输入

若需远程触发输入(如通过脚本或 API),可借助 systemd-run 或命名管道(FIFO)。例如:

# 方式一:临时交互(适合调试)
sudo systemd-run --scope -p "StandardInput=tty" -p "TTYPath=/dev/tty1" /bin/bash -c 'echo "hello from systemd" > /dev/tty1'

# 方式二:使用 FIFO(生产环境更可控)
mkfifo /tmp/myscript_input
# 在服务中修改为读取该 FIFO(需调整 script.py 的输入逻辑)

⚠️ 重要注意事项

  • 避免使用 root 运行业务脚本:始终指定 User= 字段,遵循最小权限原则。
  • 禁用 screen/tmux 方案:它们无法跨重启存活,且难以集成监控与日志管理。
  • 警惕资源泄漏:长时间运行的脚本需自行管理内存、文件句柄及网络连接,建议加入健康检查与定期重启策略(通过 RestartSec 和 StartLimitIntervalSec 控制)。
  • 日志管理:journalctl 是首选;如需持久化日志,配置 journald 的磁盘存储(Storage=persistent in /etc/systemd/journald.conf)。
  • 防火墙与安全组:若脚本需监听端口,请同步配置 GCP VPC 防火墙规则。

✅ 总结

通过 systemd 的 tty-force 终端分配机制,您不仅能实现 Python 脚本的 7×24 小时不间断运行,还能保留其交互能力。相比 nohup、screen 或第三方进程管理器(如 Supervisor),systemd 原生集成于现代 Linux 发行版,具备启动依赖管理、崩溃自动恢复、精细化日志审计等企业级特性。只需一次正确配置,即可获得高可用、易维护、符合云原生运维规范的长期运行环境。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

194

2023.11.24

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1520

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

715

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

791

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

584

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

563

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

308

2023.07.20

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号