在Go中启动后进行Daemonize

在Go中启动后进行Daemonize,go,daemon,Go,Daemon,我有一个我需要作为守护进程运行的系统,它是在go中开发的。通常情况下,我可以通过systemd之类的东西,甚至是像“/project&”这样简单的东西来管理它,但是这个特定的项目在成为守护进程之前需要获得一些输入—它需要输入密码 此密码不能作为命令行参数提供、放置在配置文件中、在源代码中硬编码等。必须由在系统启动时了解密码的人员手动提供 在启动时,项目需要收集密码,验证事情是否正确,并且只有在提供了正确的密码并通过尝试解密证书进行验证后,项目才能真正开始作为守护进程运行 项目启动、接受stdin

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

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

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

项目启动、接受stdin的输入、执行所需的任何验证等,然后才成为脱离stdin的守护进程,有什么办法吗


目前,我可以通过启动它来模拟所需的行为,在输入密码后,使用“ctrl+z”将其挂起,使用bg将进程推到后台。当然,必须有一种方法从进程本身内部实现这一点…

如果传递了加密凭据等给定标志,您可以使用标志并小心地控制应用程序流,并将其自身作为守护进程运行。甚至可以将它们存储在临时文件、数据库或任何地方

func main() {

    cred := flag.String("cred", "", "raw cred")

    flag.Parse()

    if *cred == "" {
        fmt.Print("Enter credentials:\n")
        decryptedCred, _ := bufio.NewReader(os.Stdin).ReadString('\n')

        if !validCred(decryptedCred) {
            os.Exit(1)
        }

        encryptedCred := encryptCredentials(decryptedCred)

        cmd := exec.Command("./project", fmt.Sprintf("-cred=%s", encryptedCred), "&")
        cmd.Start()

        fmt.Printf("Started project with pid: %d\n", cmd.Process.Pid)

        os.Exit(0)
    }

    for {
        // start app
        // use *cred here
    }
}
无论采用何种方法,我都可能会跟踪pid等

./project
# Enter credentials:
myCredentialsString
# Started project with pid: 11702
ps ax | grep project
# 11667 s001  R      0:02.47 ./project -cred=N/esPq8wsWn4/+Gco16ddl9UnJ0= &\012

希望这能有所帮助

这是一个我认为你的意思的程序

所以程序只检查密码。实际的守护进程是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
}
我在这里使用的守护程序是从这里获取的


不可能同时以等待输入和守护程序的形式运行单个程序。

您可以创建另一个程序,该程序的角色只需向您的守护程序发送密码,您可以通过IPC、HTTPS、,Redis PUB。通常的方法是编辑源代码,使程序执行其开始应该执行的操作。实际上,您是在询问如何使程序在获得密码后成为守护程序correct@MichaelHampton-它在做它应该做的事!对于需要加密的数据,以及密码的提供方式,都有相关的法规要求。@空格是正确的。最后使用了这样的内容,但是,使用tcp链接net.Listen/net.Dial将凭据从初始进程发送到主进程-用于将凭据作为args放入,即使它们已加密,也可以从ps-ef中恢复凭据-加密的cred值可以由任何有权访问此处源管理控制的人进行反向工程对这样的事情非常严格,这将使那些选择这个作为答案的人失败,但还没有声誉允许这样做。@user2650472您可以使用golang.org/x/crypto/ssh/terminal,而不是使用flag,它可以选择从终端读取密码,而无需回显到提示符。