为了账号安全,请及时绑定邮箱和手机立即绑定

我应该如何在后台运行Golang进程?

我应该如何在后台运行Golang进程?

Go
慕容708150 2021-05-08 04:36:31
这个问题与编程没有严格关系,但是对于程序员来说肯定是重要的。我写了一个简单的smtp服务器,当我从控制台运行它时,一切都很好,只是它阻止了命令行。我知道我可以通过运行它nohup ... &或通过屏幕/ tmux等但是问题是,我应该如何实现我的程序在后台运行,并且系统管理员可以很高兴地对其进行设置和管理过程?有些人比我有更多的经验,在golang-nuts上写道,他们不使用fork等,而是使用monit等形式的“包装器”。目标平台是基于Debian的,其他所有东西都是基于init.d的。关于该主题的任何良好资源,或编写良好的示例项目的资源?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

但是问题是,我应该如何实现我的程序在后台运行,并且系统管理员可以很高兴地对其进行设置和管理过程?

这里有几点想法。

提供软件包和存储库

安装软件是一回事,维护和运行软件则是另一回事。当然,我可以下载一个zip文件,将其解压缩,将文件放入正确的目录中(请注意,程序包通常分散在整个文件系统中),创建一个系统用户来运行守护程序,并设置相应的权限。但这很乏味,容易出错(这将导致大量票证涌入,例如“ Bah!无法运行!请修复它!”),并且如果要在许多系统上安装该软件,则几乎不可行。

因此,我们需要一个解决方案来降低采用的障碍。为这些软件包提供存储库通常不是火箭科学,并且使安装和/或更新变得更加容易。“下载->分发->安装/更新”与单个命令/服务器(例如,

$ awesomePm update coolApplication

至少为基于RedHat和Debian的系统提供软件包。就个人而言,我会选择CentOS(它将使您的软件包与几乎所有RHEL衍生版本兼容)和基本的Debian。后者也应该使为Ubuntu提供软件包变得轻而易举。由于我不再使用Debian或衍生产品,因此我不太确定它们是否真正兼容,因此我上次构建时存在启动问题.deb

提供适当的文档。记录安装的内容,安装的位置和原因。提供指向相应文档的链接。联机帮助中对依赖项的引用就足够了。这样,您甚至可以让最没有经验的管理员来配置您的程序包。

使用防御性最强的默认值

关于golang的特别说明:默认情况下,大多数软件包构建工具都会剥离软件包中包含的二进制文件。Go不支持该功能,因此请在这里保重。

完成

没有比完整的软件包更令人讨厌的了。

尽可能使用syslog并遵守约定。这样,您的日志将被放置在系统管理员期望的位置,并且如果自动过时它们会得到照顾,以防止您的应用程序导致磁盘已满。如果系统管理员希望对您的应用程序日志进行特殊处理,他将以这种方式进行配置。

不要通过应用程序轮换日志。这是用户选择如何处理它们的选择(这可能与他们的SLA有关)。即使您可以配置日志的轮换方式,管理员也必须学习如何配置日志-这会引入不必要的冗余。

如果必须写入日志文件,请遵循目标系统的日志记录策略并提供日志轮换配置文件。您不希望仅由于计算机磁盘空间不足而导致应用程序宕机,是吗?

使用系统工具,而不是重新发明轮子。如果您的应用程序需要进行一些维护,请不要在应用程序内部使用调度程序。编写维护专用工具(单片应用程序为00)并加以利用cron。专门将相应的文件添加到/etc/cron*目录之一。

提供适当的初始化脚本!这样,管理员可以使用众所周知的工具systemctl来管理应用程序的启动和关闭。当您必须对su用户使用或sudo -u在启动时使用它来调用Shell脚本时,这很烦人。即使调用此脚本,也会@onboot与标准背道而驰。仅仅因为启动方法有效,并不意味着应该使用它。

添加SE-Linux配置文件的加分点!

不用说,但是我经常看到配置错误的软件包,因此:测试您的软件包!从目标操作系统的最小安装开始,安装您的软件包并确保它按预期运行。检查您提供的每个配置。

如果您打算将软件包放入Debian的官方仓库中,您应该计划一些时间:Debian之所以稳定的原因是软件包的要求非常严格,即使您满足了所有要求,也必须去做所有事情。从不稳定的测试到稳定的测试方法。

精确一点

不要仅仅因为方便而使用现有用户。如果创建Web应用程序,请不要重复使用“ apache”或“ www”用户。创建一个专用于您的程序包的用户,并将该用户添加到相应的组中

遵循最少必要权限的原则。几乎没有理由拥有二进制世界可执行文件,而没有世界可写文件(这将是一个极端的安全漏洞)。如果没有运行应用程序,您经常会在SO上看到将权限设置为[0] 777的建议,这使每个用户都可以对文件进行任何修改。实际上,几乎没有理由使二进制文件可写给任何用户:无论如何进行更新的root用户始终可以写任何东西。所以权限应该是0550对于二进制文件。该原理也适用于数据目录等。在这里投入一些时间和精力。您不希望您的应用成为成功攻击的载体,是吗?甚至潜在的安全风险也往往会反击您和您的声誉。我倾向于将所有数据文件设置0600为应用程序的系统用户需要写入的0400文件,只读文件和0500二进制文件。然后,我进行了细化的分析,组权限应该是什么。例如:一组可能会更改Web应用程序的各个模板,但很可能不会更改资源目录子树的目录结构。

如果您为安全性付出努力,则将增加信任度。请注意,在决定采用软件包之前,通常会先检查软件包的安全性影响。

遵守FHS(!!)!即使这样:仅仅因为您可以在之下执行任何操作/opt/yourapplication,所以这样做也不总是一个好主意。而是分别安装到/usr和中/var(假设在启动时不需要您的应用程序)。

如果您有依赖项,请定义它们。不要仅假设存在包装。

如果您有本地SMTP服务器的依赖项,请不要对声明依赖项postfix。管理员可能更喜欢sendmail(无论出于何种原因)。因此,请改为定义对mail-transport-agent(Debian)或mta(RH,iirc)的依赖。

结论

我期望这是一款优秀的软件–与现有软件完美集成,并使其易于安装,维护,配置和运行,而无需学习冗余配置。如果我看到一个软件包的SELinux配置文件,那确实给供应商带来了好处-除非配置文件非常草率,否则表明供应商非常重视安全性。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 433 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信