Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

解决Go项目关闭终端后停止运行的3种实用方案(附完整操作指南)

阿贵
8月5日发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年08月05日,已超过16天没有更新,若内容或图片失效,请留言反馈。

解决Go项目关闭终端后停止运行的3种实用方案(附完整操作指南)

在Go项目部署过程中,很多开发者都会遇到一个共性问题:通过终端启动程序后,一旦关闭终端,程序就会随之停止运行。这本质上是因为程序运行在前台进程中,终端作为父进程被关闭时,子进程会被系统终止。本文将介绍3种可靠方案,彻底解决这一问题,确保Go程序在服务器上稳定运行。
go.jpg

一、问题根源:前台进程与终端的依赖关系

当我们通过./shuha(假设程序名为shuha)直接启动Go程序时,程序会作为前台进程运行,其生命周期与终端绑定:

  • 终端关闭时,系统会向关联的所有进程发送SIGHUP(挂起信号)
  • 前台进程收到该信号后会默认终止运行
  • 这就是为什么关闭终端后程序会停止的核心原因

二、解决方案详解

方案1:使用nohup命令(最简单直接)

nohup(no hang up)命令的作用是忽略终端关闭时发送的SIGHUP信号,让程序脱离终端独立运行,同时将输出日志重定向到文件。

操作步骤:

  1. 进入程序目录

    cd /www/wwwroot/auth-shuha-api  # 替换为你的项目路径
  2. 创建日志目录(可选但推荐)
    为避免日志散落在项目根目录,建议创建专门的日志文件夹:

    mkdir -p logs  # 创建logs目录
    chmod 755 logs  # 赋予读写权限
  3. 后台启动程序

    nohup ./shuha > logs/run.log 2>&1 &
    • 命令解析:

      • nohup:忽略终端关闭信号
      • ./shuha:启动Go程序
      • > logs/run.log:将标准输出(stdout)写入日志文件
      • 2>&1:将错误输出(stderr)合并到标准输出,统一写入日志
      • &:将程序放入后台运行
  4. 验证程序是否运行

    ps -ef | grep shuha  # 查看进程

    若输出包含./shuha,说明程序已在后台稳定运行。

  5. 查看实时日志

    tail -f logs/run.log  # 实时监控日志输出
  6. 停止程序(如需)
    先通过ps命令获取进程ID(PID),再用kill终止:

    ps -ef | grep shuha  # 找到进程ID(第二列数字)
    kill -9 12345        # 替换12345为实际PID

方案2:使用screen创建虚拟终端(适合频繁调试)

screen是一款终端复用工具,可创建独立的虚拟终端会话。关闭终端后,会话仍在后台运行,重新连接终端后可恢复会话继续操作。

操作步骤:

  1. 安装screen(首次使用)

    • CentOS系统:

      yum install -y screen
    • Ubuntu/Debian系统:

      apt-get install -y screen
  2. 创建新会话

    screen -S go_shuha  # 创建名为go_shuha的会话(名称可自定义)

    执行后会进入一个全新的虚拟终端。

  3. 启动程序
    在虚拟终端中正常启动Go程序:

    cd /www/wwwroot/auth-shuha-api
    ./shuha  # 前台启动(可直接看到输出日志)
  4. 脱离会话(保持程序运行)
    Ctrl + A后再按D(先按Ctrl+A,松开后按D),此时会回到原终端,程序在虚拟会话中继续运行。
  5. 重新连接会话
    关闭终端后,再次登录服务器,执行以下命令恢复会话:

    screen -r go_shuha  # 重新进入名为go_shuha的会话
  6. 终止程序与会话

    • 在会话中按Ctrl + C终止程序
    • 输入exit可关闭当前虚拟会话

方案3:使用systemd配置系统服务(最稳定,推荐生产环境)

将Go程序注册为系统服务,可通过systemctl命令管理,支持开机自启,是生产环境的最佳选择。

操作步骤:

  1. 创建服务配置文件

    vim /etc/systemd/system/shuha.service  # 用vim编辑服务文件
  2. 写入配置内容
    i进入编辑模式,粘贴以下内容(根据实际路径修改):

    [Unit]
    Description=Auth Shuha API Service  # 服务描述
    After=network.target mysql.service  # 依赖网络和MySQL服务(可选)
    
    [Service]
    User=root  # 运行用户(建议用非root用户,如www)
    WorkingDirectory=/www/wwwroot/auth-shuha-api  # 程序目录
    ExecStart=/www/wwwroot/auth-shuha-api/shuha  # 程序绝对路径
    Restart=always  # 程序崩溃时自动重启
    RestartSec=3  # 重启间隔3秒
    StandardOutput=append:/www/wwwroot/auth-shuha-api/logs/run.log  # 标准输出日志
    StandardError=append:/www/wwwroot/auth-shuha-api/logs/error.log  # 错误日志
    
    [Install]
    WantedBy=multi-user.target  # 多用户模式下启动

    Esc后输入:wq保存退出。

  3. 刷新系统服务

    systemctl daemon-reload  # 重新加载服务配置
  4. 启动服务

    systemctl start shuha  # 启动服务
  5. 设置开机自启(可选)

    systemctl enable shuha  # 开机自动启动
  6. 服务管理常用命令

    systemctl status shuha  # 查看服务状态
    systemctl stop shuha    # 停止服务
    systemctl restart shuha # 重启服务
    journalctl -u shuha     # 查看系统日志(包含服务启动信息)

三、方案对比与选择建议

方案优点缺点适用场景
nohup简单易用,无需额外配置无开机自启,管理不够规范临时测试、短期运行
screen支持会话恢复,适合调试配置稍复杂,不支持开机自启开发环境、需要频繁交互的场景
systemd稳定可靠,支持开机自启和重启配置相对复杂生产环境、长期运行的服务

四、常见问题排查

  1. 程序后台运行后无法访问

    • 检查程序是否监听0.0.0.0(而非127.0.0.1),确保外部可访问
    • 确认服务器防火墙和云安全组已开放程序端口(如8080)
  2. 日志文件无内容

    • 检查日志目录权限是否正确(程序是否有写入权限)
    • 确认启动命令中的日志路径与程序实际输出路径一致
  3. systemd服务启动失败

    • systemctl status shuha查看具体错误
    • 检查ExecStart路径是否正确,程序是否有执行权限(chmod +x shuha

通过以上方案,可彻底解决Go程序关闭终端后停止运行的问题。根据实际场景选择合适的方案,既能保证程序稳定运行,又能简化管理成本。生产环境优先推荐systemd方案,兼顾稳定性和可维护性。

喜欢就支持一下吧
点赞 1 分享 收藏
评论 抢沙发
OωO
取消 登录评论