这个问题严格来说与编程无关,但对程序员来说肯定很重要.

我编写了一个简单的smtp服务器,当我从控制台运行它时,一切正常,只是它阻塞了命令行.

我知道我可以通过

nohup ... &

或者通过屏幕/tmux等

但问题是,我应该如何实现在后台运行的程序,系统管理员很乐意设置和管理该程序?

有些比我经验丰富得多的人,golang-nuts岁,写道,他们不使用fork等,而是使用monit等形式的一些"包装器".

目标平台是基于Debian的,盒子上的所有其他东西都是基于init.d的.

对于这个主题有什么好的资源,或者是写得很好的示例项目的来源?

推荐答案

正如尼克提到的,Supervisord是一个很棒的 Select ,在我的经验中也很管用.

Nick mentioned problems with forking- forking itself works fine AFAICT. The issue is not forking but dropping privileges. Due to the way the Go runtime starts the thread pool that goroutines are multiplexed over (when GOMAXPROX > 1), the setuid systemcall is not a reliable way to drop permissions.

相反,您应该以非特权用户的身份运行程序,并使用setcap实用程序授予它所需的权限.

例如,要允许绑定到较小的端口号(如80),Run将需要在可执行文件上运行一次setcap:sudo setcap 'cap_net_bind_service=+ep' /opt/yourGoBinary

您可能需要安装setCap:sudo aptitude install libcap2-bin

Go相关问答推荐

进入缓冲通道同步

Kafka消费者在需要时不会暂停

为什么我不能使用Docker从本地访问我的Gin应用程序?

如何使用 html/template 在 golang 中运行一个范围内的范围

如何在golang中使用viper获取对象的配置数组?

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

为什么 mux.Vars() 返回空的 map[]

在golang中以JSON格式获取xwwwformurlencoded请求的嵌套键值对

使用golang sqlc中的引用参数

使用GOTK3和librsvg在Go中如何加载内联SVG?

在 Go 中使用 Apache Arrow 按时间间隔对事件进行分区

如何将验证器标记添加到嵌套字段

使用 Grafana alert 在几分钟内重复alert

Gorm 预加载给出了模糊的列错误

golang 中的可变参数函数

处理程序后访问 HTTP 请求上下文

转到文本/模板模板:如何根据模板本身的值数组判断值?

Go Fyne 禁用 HSplit 调整大小?

使用 bolthold 3 条件进行 boltDB 查询

将基本 HTTP AUth 用户/密码凭据存储在 GO 中,无需外部包