Go项目关闭终端后停止运行的3种实用解决方案

 更新时间:2025年08月28日 09:20:34   作者:网友阿贵  
在Go项目部署过程中,很多开发者都会遇到一个共性问题:通过终端启动程序后,一旦关闭终端,程序就会随之停止运行,本文将介绍3种可靠方案,彻底解决这一问题,确保Go程序在服务器上稳定运行,需要的朋友可以参考下

引言

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

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

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

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

二、解决方案详解

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

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

操作步骤:

进入程序目录

cd /www/wwwroot/auth-shuha-api  # 替换为你的项目路径

创建日志目录(可选但推荐)
为避免日志散落在项目根目录,建议创建专门的日志文件夹:

mkdir -p logs  # 创建logs目录
chmod 755 logs  # 赋予读写权限

后台启动程序

nohup ./shuha > logs/run.log 2>&1 &

命令解析:

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

验证程序是否运行

ps -ef | grep shuha  # 查看进程

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

查看实时日志

tail -f logs/run.log  # 实时监控日志输出

停止程序(如需)
先通过ps命令获取进程ID(PID),再用kill终止:

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

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

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

操作步骤:

安装screen(首次使用)

CentOS系统:

yum install -y screen

Ubuntu/Debian系统:

apt-get install -y screen

创建新会话

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

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

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

cd /www/wwwroot/auth-shuha-api
./shuha  # 前台启动(可直接看到输出日志)

脱离会话(保持程序运行)
Ctrl + A后再按D(先按Ctrl+A,松开后按D),此时会回到原终端,程序在虚拟会话中继续运行。

重新连接会话
关闭终端后,再次登录服务器,执行以下命令恢复会话:

screen -r go_shuha  # 重新进入名为go_shuha的会话

终止程序与会话

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

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

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

操作步骤:

创建服务配置文件

vim /etc/systemd/system/shuha.service  # 用vim编辑服务文件

写入配置内容
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保存退出。

刷新系统服务

systemctl daemon-reload  # 重新加载服务配置

启动服务

systemctl start shuha  # 启动服务

设置开机自启(可选)

systemctl enable shuha  # 开机自动启动

服务管理常用命令

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

三、方案对比与选择建议

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

四、常见问题排查

程序后台运行后无法访问

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

日志文件无内容

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

systemd服务启动失败

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

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

以上就是Go项目关闭终端后停止运行的3种实用解决方案的详细内容,更多关于Go关闭终端后停止运行的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结

    如果你是一个开发人员,或多或少对树型结构都有一定的认识。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。本文为大家总结了一些二叉树必会知识点,需要的可以参考一下
    2022-08-08
  • Go 实现 Nginx 加权轮询算法的方法步骤

    Go 实现 Nginx 加权轮询算法的方法步骤

    本文主要介绍了Go 实现 Nginx 加权轮询算法的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • GORM框架实现分页的示例代码

    GORM框架实现分页的示例代码

    本文主要介绍了GORM框架实现分页的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • golang 实现并发求和

    golang 实现并发求和

    这篇文章主要介绍了golang 并发求和的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Gin框架使用Zap接收日志的实现

    Gin框架使用Zap接收日志的实现

    在Gin框架中使用Zap日志中间件替代默认日志,通过封装日志包提升性能,实现更高效的日志记录与异常恢复功能,下面就来介绍一下Gin框架使用Zap接收日志的实现,感兴趣的可以了解一下
    2025-05-05
  • golang package time的用法具体详解

    golang package time的用法具体详解

    本篇文章主要介绍了golang package time的用法具体详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • go 如何修改postgresql的配置参数

    go 如何修改postgresql的配置参数

    这篇文章主要介绍了go 如何修改postgresql的配置参数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 协同开发巧用gitignore中间件避免网络请求携带登录信息

    协同开发巧用gitignore中间件避免网络请求携带登录信息

    这篇文章主要为大家介绍了协同开发巧用gitignore中间件避免网络请求携带登录信息
    2022-06-06
  • go单例实现双重检测是否安全的示例代码

    go单例实现双重检测是否安全的示例代码

    这篇文章主要介绍了go单例实现双重检测是否安全,本文给大家分享双重检验示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Golang环境搭建及打包和工具链详解

    Golang环境搭建及打包和工具链详解

    这篇文章主要介绍了Golang环境搭建及打包和工具链,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论