首页 > 解决方案 > 在 Go 中启动后守护进程

问题描述

我有一个需要作为守护进程运行的系统,该系统已在 go 中开发。通常,我可以通过 systemd 之类的东西甚至像 ' ./project & ' 这样简单的东西来管理它,但是这个特定的项目需要在它成为守护程序之前获得一些输入 - 它需要输入密码。

此密码不能作为命令行参数提供、放置在配置文件中、在源代码中硬编码等。它必须由知道密码的人在系统启动时手动提供。

在启动时,项目需要收集密码,验证一切是否正确,并且只有提供了正确的密码(通过尝试解密证书来验证)才能真正开始作为守护进程运行。

有什么办法可以让项目启动,接受来自标准输入的输入,执行任何需要的验证等,然后才成为一个守护进程(从标准输入等分离)?

目前我可以通过启动它来模拟所需的行为,并在输入密码后使用'ctrl+z'暂停它并使用 bg 将进程推送到后台。当然,必须有一种方法可以从流程本身中做到这一点......

标签: godaemon

解决方案


这是一个执行我认为您的意思的程序。

所以程序只检查密码。实际的守护进程webserver只有在密码签出时才会被调用。

package main

import (
    "golang.org/x/crypto/ssh/terminal"
    "os/exec"
)


func main() {
    pwd, err := terminal.ReadPassword(1)
    if err != nil {
        panic(err)
    }

    if string(pwd) == "test" {
        c := exec.Command("./webserver")
        c.Run()
    }
    return
}

我在这里使用的守护程序是从这里获取的

https://github.com/sevlyar/go-daemon/blob/master/examples/cmd/gd-simple/simple.go

它不可能同时作为等待输入和作为守护进程运行单个程序。


推荐阅读