当前位置:首页 > 科技  > 软件

如何让Go程序以后台进程或daemon方式运行

来源: 责编: 时间:2024-01-26 17:06:39 347观看
导读本文探讨了如何通过Go代码实现在后台运行的程序。最近我用Go语言开发了一个WebSocket服务,我希望它能在后台运行,并在异常退出时自动重新启动。我的整体思路是将程序转为后台进程,也就是守护进程(daemon)。它不处理具体的

本文探讨了如何通过Go代码实现在后台运行的程序。最近我用Go语言开发了一个WebSocket服务,我希望它能在后台运行,并在异常退出时自动重新启动。我的整体思路是将程序转为后台进程,也就是守护进程(daemon)。它不处理具体的业务逻辑,而是再次使用相同的参数调用自身,启动一个子进程来处理业务逻辑。守护进程监视子进程的状态,如果子进程退出,则再次启动一个新的子进程。这样就能保证在服务异常终止时及时重启。Ceo28资讯网——每日最新资讯28at.com

我在网上找到了一个开源库,github.com/sevlyar/go-daemon,它很方便地实现了在后台启动一个新的进程,但如果后台进程再次尝试作为另一个后台进程启动,会出现错误。Ceo28资讯网——每日最新资讯28at.com

后来我阅读了源代码才发现:为了区分当前进程是父进程还是子进程,作者巧妙地设计了一个环境变量标识。正是因为这种识别策略,该库只能启动一次自身作为后台进程,无法连续启动自身为后台进程。Ceo28资讯网——每日最新资讯28at.com

不过,这种使用环境变量来区分进程身份的思路给我启发很大。基于这个想法,我通过延伸和优化,最终实现了在保持参数不变的情况下连续启动自身为后台进程。我对作者表示敬意。Ceo28资讯网——每日最新资讯28at.com

此外,我还找到了一些其他的库,它们的思路有所不同,主要通过添加特殊参数来标记进程身份。但是,这些方法并没有完美地解决让进程启动自身的问题,令我有些遗憾。Ceo28资讯网——每日最新资讯28at.com

最终,我决定自己实现一个库来解决我的项目需求,并希望它是一个通用的库,可以快速方便地将用Go语言编写的服务程序转为后台运行或守护进程模式运行。本文总结了我在这次探索中的经验和收获。Ceo28资讯网——每日最新资讯28at.com

首先,让我们区分一下两个概念:后台运行和守护进程。平常交流时,我们可能不太区分或区分不够清晰。在本文中,我想明确如下定义:Ceo28资讯网——每日最新资讯28at.com

后台运行:指进程在操作系统中以非显示方式运行,没有与任何命令行终端或程序界面相关联。这种方式下运行的进程称为后台进程,比如没有与任何终端相关联的命令行程序进程。Ceo28资讯网——每日最新资讯28at.com

守护进程:也称为守护进程,它首先以后台运行方式启动,然后还有额外的职责。在本文中,我的定义是守护进程可以监视Go服务程序进程的状态,如果异常退出,可以自动重新启动。这样守护进程可以确保服务程序一直在后台运行,即使它在某些情况下崩溃或意外终止。Ceo28资讯网——每日最新资讯28at.com

接下来,我将介绍如何使用Go代码来实现在后台运行的程序,并将其转化为一个守护进程。Ceo28资讯网——每日最新资讯28at.com

后台运行程序

要将Go程序在后台运行,可以使用一些操作系统级别的方法。以下是一种简单的方法:Ceo28资讯网——每日最新资讯28at.com

package mainimport (    "fmt"    "os"    "os/exec"    "syscall")func main() {    if os.Getppid() != 1 {        cmd := exec.Command(os.Args[0])        cmd.Start()        fmt.Println("Background process ID:", cmd.Process.Pid)        os.Exit(0)    }    // 在这里写入具体的业务逻辑代码    fmt.Println("Running in background...")    select {}}

在上面的代码中,我们首先使用os.Getppid()函数获取当前进程的父进程ID。如果父进程不是1,说明当前进程不是守护进程,而是从终端启动的。在这种情况下,我们创建一个新的命令,使用相同的参数再次启动程序,并在后台运行。我们打印出新进程的PID,并退出初始进程。Ceo28资讯网——每日最新资讯28at.com

如果进程的父进程是1,那么说明当前进程已经是守护进程了,我们可以在此处写入具体的业务逻辑代码。Ceo28资讯网——每日最新资讯28at.com

使用这种方法,我们可以确保程序在后台运行,而且还可以检查是否已经启动了一个后台进程。Ceo28资讯网——每日最新资讯28at.com

守护进程

将程序转化为守护进程需要额外的步骤,我们需要创建一个监听子进程状态的循环,并在子进程异常退出时重新启动它。以下是一个简单的守护进程实现:Ceo28资讯网——每日最新资讯28at.com

package mainimport (    "fmt"    "os"    "os/exec"    "syscall")func main() {    if os.Getppid() != 1 {        cmd := exec.Command(os.Args[0])        cmd.Start()        fmt.Println("Background process ID:", cmd.Process.Pid)        os.Exit(0)    }    // 在这里写入具体的业务逻辑代码    fmt.Println("Running in background...")    for {        cmd := exec.Command(os.Args[0])        cmd.Start()        exitCh := make(chan error)        go func() {            exitCh <- cmd.Wait()        }()        err := <-exitCh        if err != nil {            fmt.Println("Process exited with error:", err)        } else {            fmt.Println("Process exited successfully")        }        select {        case <-exitCh:        default:        }    }}

在上面的代码中,我们添加了一个循环,用于监听子进程的状态。在每次子进程退出之后,我们使用相同的参数再次启动守护进程,并重新开始监听。这样就可以确保服务程序在异常退出时能够自动重新启动。Ceo28资讯网——每日最新资讯28at.com

这只是一个简单的守护进程实现,你可以根据自己的需求进行扩展和优化。Ceo28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-69006-0.html如何让Go程序以后台进程或daemon方式运行

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 你知道C++如何在一个函数内返回不同类型吗?

下一篇: React 19 即将推出的四个全新 Hooks,很实用!

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top