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


24

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

让我们iptables举个例子。然后 ..

  • 每当iptables服务stopped或(换句话说)没有运行,我希望它是started(或restarted)..自动无论何时停止(或不运行)。
  • 用其他更简单的话来说,我想一直保持服务运行。

(如果是实时检查,可能是我可以给我适当的检查频率。所以可以说,每5分钟一次)

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

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

谢谢!


你不应该那样做。假设服务配置不正确,您的策略将实现什么?无数次重审。相反,您应该编写一个crontab脚本,使alerts您无法正常工作。
MariusMatutiae 2013年

对于原始问题,我只是对直接解决方案感到好奇。而且,我有一项服务,restarted无论出于任何原因,只要停止该服务即可。重新启动没有问题。
夏期剧场

1
您自己建议的解决方案足够聪明。如果正确使用它(如果服务已经在运行,请立即退出,警告您该服务已停止,以便您对其进行修复,依此类推……),这是最简单的方法。自动停止的服务是有问题的服务,因此最终您应该对其进行修复,但否则,作为一个临时补丁,cron脚本或其他大多数时间处于休眠状态的超简单守护程序,就可以很好地完成工作。有一些工具,例如mmonit.com/monit,但我认为最终它们都使用了类似的方法

@MariusMatutiae,我同意您的观点,但这取决于服务的性质,大多数流程管理器将在多次失败的重启后退出。一个过程自然结束并且让我们想要自动重启它是完全合理的,例如,一个工人从队列中拿起工作并在每次运行后结束。对于遭受定制的内存泄漏代码的系统管理员来说,它也是一个方便的工具-限制进程的生命周期并在无法使用之前自动重新启动它...
Alex Forbes

Answers:


25

2018年3月更新

这个答案现在已经很老了,而且由于它是书面的,因此在Linux上赢得了pid1战争。因此,如果systemd内置在您的发行版中(这是大多数),您可能应该创建一个systemd单元。

以下答案保留用于后代。


上面的监控答案是有效的,但我想我要提到一些替代方法:

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

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

我已经使用过runit并且非常喜欢它,但是最容易使用的是超级用户。它的文档也很好,几乎可以在任何地方使用,并且打包在所有主要发行版中。

但是,无论您做什么,请不要使用shell脚本。这种方法有很多错误!


如何使用sysvinit?
horseyguy

12

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

MariusMatutiae的观点是正确的,但是我们已经完成了一个简单的脚本来监视服务器中的HTTPD和DNS服务,它运行良好。每当服务关闭时,脚本都会重新启动服务并向我们发出警报,我们会收到有关该服务关闭的大量警报/邮件,然后我们可以对其进行调查。
Ranjithkumar T


0

我知道问这个问题已经好几年了。但是使用systemd(通常在centos和REHL中可用),您可以使用cron运行此bash命令以检查并在服务关闭时重新启动。

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

将其保存在您的bin目录中,并将其命名为monitor。授予适当的文件权限。然后像

sudo monitor redis

如果要检查Redis服务并根据需要重新启动/启动。

最后,将其添加到您的cron作业中。

希望这会有所帮助


0

为了增加一长串的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将其用于服务监督。虚空现在也可以携带66。我不知道是否有人将s6移植到xxBSD或其他xxIX系统上,以及在何种程度上进行了移植。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.