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 变量字符串与字符编码问题

    Go的字符串是由单个字节连接起来的,Go语言的字符串的字节使用UTF-8编码标识Unicode文本,接下来通过本文给大家介绍下Go变量字符串与字符编码问题,需要的朋友可以参考下
    2022-04-04
  • Golang中fsnotify包监听文件变化的原理详解

    Golang中fsnotify包监听文件变化的原理详解

    Golang提供了一个强大的fsnotify包,它能够帮助我们轻松实现文件系统的监控,本文将深入探讨fsnotify包的原理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Golang 实现插入排序的方法示例(2种)

    Golang 实现插入排序的方法示例(2种)

    这篇文章主要介绍了Golang 实现插入排序的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 解决golang post文件时Content-Type出现的问题

    解决golang post文件时Content-Type出现的问题

    这篇文章主要介绍了解决golang post文件时Content-Type出现的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言处理Excel文件的教程详解

    Go语言处理Excel文件的教程详解

    在Go语言中,有许多库和工具可用于处理Excel文件,本文将介绍如何使用Go语言处理Excel文件,包括读取、写入和修改Excel文件,需要的小伙伴可以了解下
    2024-01-01
  • Go语言中常用的日期与时间处理方法详解

    Go语言中常用的日期与时间处理方法详解

    Go 语言中的日期与时间处理主要通过标准库 time 包实现,它提供了丰富的时间获取、计算、格式化、解析等功能,适用于定时任务、日志记录、时间差计算等场景,下面小编就和大家详细介绍一下吧
    2025-10-10
  • Go 获取当前运行文件的目录的多种方法实现

    Go 获取当前运行文件的目录的多种方法实现

    在Go语言中获取当前运行文件目录有多种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Golang实现AES对称加密算法实例详解

    Golang实现AES对称加密算法实例详解

    所谓对称加密是指在加密和解码时使用同一密钥的加密方式,下面这篇文章主要给大家介绍了关于Golang实现AES对称加密算法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Go语言开发中redis的使用详解

    Go语言开发中redis的使用详解

    这篇文章主要介绍了Go语言开发中redis的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • go module构建项目的实现

    go module构建项目的实现

    本文主要介绍了go module构建项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论