设法杀死远程机器上的 sshd(通过运行使用机器中所有可用内存的脚本,哎呀......),除了访问 [1] 的主机之外,我无法访问它,我正在考虑确保该 sshd 始终保持运行。
除了每隔 n 分钟或几小时重新启动 sshd 的 hacky cron 作业之外,使用 inittab 获取 init 以保持 sshd 运行似乎是个好主意。
这种方法有什么缺点吗? 这似乎是 Linux 发行版默认做的事情,因为 sshd 通常是机器唯一可用的访问方法。
此外,还有其他我应该使用这种方法的守护进程吗?也许是用于 nagios 的监视代理,例如 nrpe?
[1] 是的,管理卡或网络电源开关是个好主意,但它们当时被认为是“不必要的”......
这个想法有一些实现。Upstart被 Ubuntu 使用,并且可以在服务死亡时重新启动服务,Solaris 10 具有Service Management Facility,runit是跨平台的,并且已经提到了 daemontools。
除了升级后重新启动 sshd 有点不方便之外,我想不出没有其他理由不做inittab 的事情。
除此之外:有趣的想法。
您可以告诉 linux OOM 杀手不要杀死 sshd,google oom_adj 了解更多详细信息,或者参见 ie here rhel manual
在确保服务始终运行的计划下,拥有需要可靠的服务是有好处的。由于此处记录的原因,我自己更喜欢使用 daemontools:http: //cr.yp.to/daemontools/faq/create.html
我没有以这种方式运行 ssh,但如果我处于我认为我当前的 SSH 管理不起作用的情况下,我会很高兴这样做。至于您的“内存不足”问题,您可以降低某些进程(如 sshd)的优先级,这样它们就不会被 OOM 杀手杀死,而有利于实际导致问题的程序。
一个有趣的想法。
我还没有尝试过这样的事情,但我会检查启动过程中 inittab 的启动时间。如果为时过早,您可能无法运行网络。
Monit是一个监控守护进程,专为您想要在此处执行的操作而设计。
我能预见的唯一问题是,如果它试图重生并出现配置错误。
我以为你可以限制重生,但我似乎找不到任何文档来支持这一点。
就像我之前提到的其他人一样,使用 daemontools 或 monit 等现有工具可能是最聪明的方法。您不能使用 inittab 生成 sshd,因为它会分叉到后台,并且 init 会尝试运行多个 sshd。您很可能会收到“init: re-spawning too fast”消息。
您可能想要编写一个小型监控脚本,该脚本将在循环中运行并确保原始 sshd(接受连接和分叉以处理会话的那个)仍在运行。一个失败,只需使用系统的初始化脚本重新运行它。
请注意,如果您的 sshd 被内核的 OOM 处理程序杀死,则无法保证您的 sshd 将在重新启动后继续存在...