使用inittab来确保sshd(和其他重要的项目)仍在运行 – 有什么缺点?

设法杀死远程计算机上的sshd(通过运行一个使用机器中所有可用内存的脚本,oops …),除了访问主机[1]之外我无法访问,我正在考虑如何确保该sshd始终保持运行。

除了每隔n分钟或几小时重新启动sshd的hacky cron作业外, 使用inittab让init保持sshd运行似乎是一个好主意

这种方法有什么缺点吗? 这似乎是Linux发行版默认情况下明智的做法,因为sshd通常是机器唯一可用的访问方法。

另外,还有其他的守护进程,我应该使用这种方法? 也许是一个监控代理,如nagios的nagios?

[1]是的,pipe理卡或networking电源开关将是一个好主意,但他们当时被认为是“不必要的”。

这个想法有几个实现。 Ubuntu使用Upstart ,如果它们死亡,可以重新启动服务,Solaris 10具有服务pipe理工具 , runit是跨平台的,前面已经提到了daemontools。

我可以想到没有其他的原因不做inittab的事情,比升级后重新启动sshd有点不方便。

除此之外:有趣的想法。

你可以告诉linux OOM杀手不要杀sshd,google for oom_adj了解更多细节,或者看看ie这里rhel手册

根据一个可以确保它们始终运行的scheme,使服务需要可靠是有好处的。 我更喜欢使用daemontools,因为这里logging的原因: http : //cr.yp.to/daemontools/faq/create.html

我没有以这种方式运行ssh,但是如果我认为当前的SSHpipe理不起作用的话,我会很高兴。 就你的“内存不足”问题而言,你可以对sshd等特定的进程进行优先级sorting,以避免OOM杀手为了实际上导致问题的程序而被杀害。

一个有趣的想法。

我还没有尝试过这样的事情,但是我会检查在启动过程中什么时候启动了inittab中的东西。 如果太早,可能没有networking运行。

Monit是一个监控守护进程,它是专门为你想在这里做的事情而devise的。

我可以预见的唯一问题是如果它试图重新configuration一个configuration错误。

我以为你可以限制respawning,但我似乎无法find任何文件来支持这一点。

像其他人之前指出的那样,使用像daemontools或monit这样的现有工具可能是最智能的路线。 您不能使用inittab来产生sshd wince它叉到后台,init会尝试运行几个sshd的。 你很可能会得到“初始化:重新产生太快”的消息。

您可能需要编写一个小的监视脚本,它将运行在一个循环中,并确保原始sshd(接受连接和分叉来处理会话的脚本)仍在运行。 一个失败,只需使用系统的初始化脚本重新运行它。

请注意,如果你的sshd被内核的OOM处理程序杀死,那么你不能保证你的sshd能够在重启之后幸存下来。