在第一次学习 SMF 之后,我正在学习 Upstart。
当然,我假设它们实现了相同的目的,但我知道这是我错的地方。
理想情况下,我希望有人写了一个比较,这样我就不必挖掘 Upstart 中不存在的功能。 Solaris 有一个称为合同子系统的东西,它内置于内核中,这实际上是 SMF 中大多数功能的实现方式。我知道 Linux 中可能没有类似的东西,这可能就是为什么我无法弄清楚 Upstart 在服务停止、服务监控和故障重启方面的期望。
更具体地说,我在 Upstart 中无法真正弄清楚的事情:
停止。对于 SMF,我非常习惯让 SMF 执行停止过程。我从来没有真正编写过具体的终止脚本,我不需要跟踪 PID,也不需要知道一个进程产生了多少次,等等。这在 Upstart 中看起来更像是一个 DIY 过程。正确的 ?
故障重启。我真的不明白这是否是Upstart的一个功能。我看到 Linux 人们将 Upstart 与某种类型的用户态进程监控机制结合起来。也许这就是我应该做的?
观看。我喜欢 SMF
svcs -p <servicename>
命令,它允许我查看(当前)服务的所有进程。在 Upstart 中,我认为“服务”=“进程”,这意味着在 Upstart 中命令initctl status <jobname>
将始终只显示单个进程。如果我的服务从操作系统的角度来看是两个独立的进程怎么办?保证仅一个实例。对于大多数守护进程,您确实希望确保只有一个已启动的实例。对于某些服务,即使尝试启动第二个实例也可能是致命的。我想告诉 Upstart 这件事并让 Upstart 向我保证这一点。因此,即使操作符执行
service xyz start
并且xyz
已经在运行,它也不应该导致尝试启动 的另一个实例,xyz
也不应该导致尝试重新启动xyz
。我可以这样做吗?代表团。通过 SMF,我将某些服务的责任委托给非特权用户。例如,我有一小群非特权用户,他们被授予启动/停止自己的 80 端口网络服务器的权利。我通过为此服务分配能够绑定到特权端口(端口号<1024)的权限来做到这一点 没有向服务分配任何其他类似 root 的权限。然后,我通过角色将该服务的启动/停止权限委托给一组用户。我假设在 Upstart 中我必须执行一些 sudo 脚本才能实现相同的目的?
当更仔细地观察时,在我看来,Upstart 甚至几乎是作为cron
.它具有 SMF 没有的短期运行作业或重复任务的概念。 SMF——顾名思义——纯粹专注于服务,即长时间运行的进程。这可能是让我困惑的地方。但现在我只关注如何配置这些长时间运行的进程。我正在寻找一种方法来向操作系统描述我的服务(例如先决条件,如何启动、停止、委派、特权等),然后让操作系统从此处理它。
更新 1:了解了更多信息:这在 Linux 中肯定没有统一,即 Linux 社区在这个问题上没有达成共识……温和地说。这意味着我必须让你们了解发行版:CentOS,有时还有一点 RedHat(都是版本 6 系列)。
更新 2:我发现——至少有些人说——RedHat(以及 CentOS)将在下一个主要版本中放弃 Upstart,转而使用名为systemd
.这让我更加困惑。如果我现在想在 CentOS/RH 上构建可靠的服务该怎么办?