Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go关闭终端后停止运行

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

作者:网友阿贵

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

引言

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

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

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

二、解决方案详解

方案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 &

命令解析:

验证程序是否运行

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的会话

终止程序与会话

方案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稳定可靠,支持开机自启和重启配置相对复杂生产环境、长期运行的服务

四、常见问题排查

程序后台运行后无法访问

日志文件无内容

systemd服务启动失败

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

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

您可能感兴趣的文章:
阅读全文