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

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

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

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

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

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

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

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

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

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

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

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

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

后台运行程序

要将Go程序在后台运行,可以使用一些操作系统级别的方法。以下是一种简单的方法:1nB28资讯网——每日最新资讯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,并退出初始进程。1nB28资讯网——每日最新资讯28at.com

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

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

守护进程

将程序转化为守护进程需要额外的步骤,我们需要创建一个监听子进程状态的循环,并在子进程异常退出时重新启动它。以下是一个简单的守护进程实现:1nB28资讯网——每日最新资讯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:        }    }}

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

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top