如何监视 Linux 中的服务并在停止时重新启动

如何监视 Linux 中的服务并在停止时重新启动

实际上我不太确定我是否应该使用 Shell 脚本,或者是否已经有一些方法。但无论我们使用哪种方法,我都希望始终保持服务运行。

apache2个例子吧。然后..

  • 每当服务apache2已停止或未运行,我希望它自动启动(或重新启动)。
  • 简单来说,我想保留一个服务始终处于运行状态。

(也许我可以给出一个合理的频率来检查,如果进行实时检查就是问题所在。因此假设每 5 分钟一次)

我能想到的唯一方法是使用带有 Cron Tab 的 Shell 脚本。

  • 请问有什么智能解决方案吗?

谢谢!

答案1

2018 年 3 月更新

这个答案现在已经很老了,自从它被写下来以来,systemd 已经赢得了 Linux 上的 pid1 战争。因此,你应该创建一个systemd单元,如果 systemd 内置于您的发行版中(大多数都是如此)。

下面的答案将被保存以供后人参考。


上面的 monit 答案是有效的,但我想我会提到一些替代方案:

值得记住的是,您的操作系统已经解决了进程管理问题。传统上,Linux 使用 sysvinit,它基本上是您在 init.d 中看到的脚本集合。然而,它相当笨拙,无法监控进程,init.d 脚本很复杂,它被替换是有充分理由的。

越来越多的现代操作系统开始取代 sysvinit,其中领先的是 Upstart 和 Systemd。Debian 倾向于使用 systemd,Ubuntu 开发并已基本过渡到 Upstart,而像 Debian 一样,Redhat/CentOS/Fedora 也正在转向 systemd。因此,如果您使用的操作系统已经取代了 sysvinit,我建议您使用内置的脚本。这些脚本比 init 脚本更容易编写。

我使用过 runit,并且非常喜欢它,但最容易使用的还是 Supervisor。它也有非常完善的文档,几乎可以在任何地方使用,并且包含在所有主要发行版中。

但无论你做什么,请千万不要使用 shell 脚本。这种方法有很多问题!

答案2

iptables是一个糟糕的例子,因为它实际上并不是正在运行的服务或守护进程,而是内核的一部分。您无法真正“停止” iptables,您只能给它一个配置,而“停止”它需要给它一个空白配置。事实上,我的 Linux 系统崩溃过,但使用的端口转发设置iptables继续工作。

无论如何,一个名为monit会做你想做的事。如果你使用 Debian,这是一个apt-get install monit不错的选择。它有点复杂,但非常灵活。

答案3

我们正在使用这个简单的脚本来发出警报,并在服务未运行时启动它,您也可以添加更多服务。

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

答案4

为了增加 init/svc 监管的长列表,作为 S6 的子目录,有一个新成员 66,它以快速、轻便、用户友好的方式处理 s6 服务管理和日志记录。这是 Obarun-Linux 官方文档的链接https://web.obarun.org/software

这是关于如何使用这 66 个软件和理解 s6 的常见问题解答http://sysdfree.wordpress.com/266

自稳定版本发布以来,只发现了一个与内核从 4.20-->5.0 的变化相关的错误,所有其他报告的问题都与人们学习新知识有关。如果服务管理必须变得比这更简单,那么最好切换到 ms-windows(Linus 禁止)。要实际了解它如何工作,只需下载 Obarun live.iso 并试用它。安装服务及其 66 个脚本,启用它们、杀死它们、查看它们的日志、停止它们和启动它们(启用时),将服务集中到树中并让服务树一起启动和停止,将用户级服务与系统分开。它完成了 s6 所擅长的事情,并使用户更容易利用 s6 下的防弹系统。

图片下载地址:https://web.obarun.org/index.php?id=74 md5 检查文件https://repo.obarun.org/iso/

除了 init 和服务管理之外,s6/66 不依赖系统上的其他任何东西。它是基础系统的一层,其余软件可以独立运行,init/svc-mgmt 是盲目的。所有 s6 和 66 都是用 C 编写的,它不是 Linux 特定的,也不是 glibc 特定的。Skarnet(s6 作者)的服务器在 musl 定制系统上运行了近十年,没有太多暂停。Alpine、Void 和 Adelie 目前在他们的存储库中也有 s6 软件,Adelie 默认使用它进行服务监督。Void 现在也搭载了 66。我不知道是否有人将 s6 移植到 xxBSD 或其他 xxIX 系统,以及移植到何种程度。

相关内容