Solaris SMF 与 Linux Upstart

uni*_*010 9 linux solaris upstart smf

在第一次学习 SMF 之后,我正在学习 Upstart。

当然,我假设它们实现相同的目的,但我知道这是我错的地方。

理想情况下,我希望有人写了一个比较,这样我就不必挖掘 Upstart 中不存在的功能。Solaris 有一个叫做 Contract Subsystem 的东西,它内置在内核中,这实际上是启用 SMF 中大部分功能的原因。我知道在 Linux 中可能没有等价物,这可能是我无法弄清楚在服务停止以及服务监控和故障重启方面我可以从 Upstart 期望什么的原因。

更具体地说明我在 Upstart 中无法真正弄清楚的事情:

  1. 停止。对于 SMF,我几乎习惯于让 SMF 执行停止过程。我从来没有真正写过特定的终止脚本,我不需要跟踪 PID,我不需要知道一个进程产生多少次等等。这在 Upstart 中更像是一个 DIY 过程。正确的 ?

  2. 失败时重启。我真的不明白这是否是 Upstart 的功能。我看到 Linux 人员将 Upstart 与某种类型的用户进程监控机制相结合。也许这就是我应该做的?

  3. 观看。我喜欢 SMFsvcs -p <servicename>命令,它允许我查看(当前)属于服务的所有进程。在 Upstart 中,在我看来“服务”=“进程”意味着在 Upstart 中initctl status <jobname>命令将始终只显示一个进程。如果我有一个从操作系统的角度来看是两个独立进程的服务怎么办?

  4. 保证只有一个实例。对于大多数守护进程,您确实希望确保只有一个已启动的实例。对于某些服务,即使尝试启动第二个实例也可能是致命的。我想告诉 Upstart 并让 Upstart 向我保证这一点。因此,即使操作员执行service xyz start并且xyz已经在运行它也不应该导致尝试启动另一个实例,xyz也不应该导致尝试重新启动xyz。我可以这样做吗?

  5. 委托。通过 SMF,我将某些服务的责任委托给非特权用户。例如,我有一小组非特权用户已被授予启动/停止他们自己的端口 80 网络服务器的权利。为此,我为此服务分配了权限,以便能够绑定到特权端口 (portno<1024), 而无需为该服务分配任何其他类似 root 的特权。然后我通过一个角色将该服务的启动/停止权限委托给一组用户。我假设在 Upstart 中,我必须执行一些 sudo 脚本才能实现相同的目标?

当更仔细地观察时,在我看来,Upstart 几乎是为了替代cron. 它具有 SMF 没有的短期运行作业或重复任务的概念。SMF 顾名思义,完全专注于服务,即长期运行的流程。这可能是让我困惑的地方。但现在我只关注如何配置那些长时间运行的进程。我正在寻找一种方法来向操作系统描述我的服务(例如,前提条件、如何启动、停止、委派、特权等),然后让操作系统从那时起处理它。

更新 1:学到了更多:这肯定不会在 Linux 中统一,即 Linux 社区在这件事上没有达成共识……说得委婉一点。这意味着我必须让你们知道发行版:CentOS,有时还有一点 RedHat(都在版本 6 系列中)。

更新 2:我发现 - 至少有些人说 - RedHat(以及 CentOS)将在下一个主要版本中放弃 Upstart,转而使用名为systemd. 这只会让我更加困惑。如果我今天想在 CentOS/RH 上构建可靠的服务怎么办?