go - 在 Go 中启动后守护进程
问题描述
我有一个需要作为守护进程运行的系统,该系统已在 go 中开发。通常,我可以通过 systemd 之类的东西甚至像 ' ./project & ' 这样简单的东西来管理它,但是这个特定的项目需要在它成为守护程序之前获得一些输入 - 它需要输入密码。
此密码不能作为命令行参数提供、放置在配置文件中、在源代码中硬编码等。它必须由知道密码的人在系统启动时手动提供。
在启动时,项目需要收集密码,验证一切是否正确,并且只有提供了正确的密码(通过尝试解密证书来验证)才能真正开始作为守护进程运行。
有什么办法可以让项目启动,接受来自标准输入的输入,执行任何需要的验证等,然后才成为一个守护进程(从标准输入等分离)?
目前我可以通过启动它来模拟所需的行为,并在输入密码后使用'ctrl+z'暂停它并使用 bg 将进程推送到后台。当然,必须有一种方法可以从流程本身中做到这一点......
解决方案
这是一个执行我认为您的意思的程序。
所以程序只检查密码。实际的守护进程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
它不可能同时作为等待输入和作为守护进程运行单个程序。
推荐阅读
- typescript - 函数定义参数中的大括号是什么?
- okta - 使用 Okta 进行保险柜身份验证
- php - apache 的 CORS 问题
- ssl - 带有 https 的码头服务器
- python - 以不同方式对相似数据进行正则表达式并填充数据框
- graphql - Graphql 服务器端如何使用模式
- sql - 在 Oracle 11g SQL 中,是否有更新列的优先顺序?
- sql-server - Excel VBA 到 SQL Server 2016 连接字符串错误
- javascript - 如何在 Wordpress Rest API 中显示菜单页面子项?
- javascript - 4sum如何通过测试用例