如何使用Linux软件看门狗?

26

有人能告诉我如何在Linux中处理软件看门狗吗?

我有一个名为SampleApplication的程序,它需要持续运行,如果它挂起或意外关闭,我需要重新启动它。

我在谷歌上搜索发现Linux有一个位于/dev/watchdog的看门狗,但不知道该如何使用。能否给我提供一个例子帮助我理解吗?

我的问题是,我在哪里指定我的应用程序名称和延迟间隔以进行重新启动?


1
据我所知,这只是确保整个系统不会挂起并在需要时进行重置。我认为您不能仅使用它来保持用户空间应用程序的活动状态。 - Janne
我有在嵌入式Linux应用程序中使用过一个工具,它可以完成你所要求的功能。不幸的是,我现在无法想起它的名字,否则我会回答你的问题。但我知道它的工作方式基本上与你提出的建议相同。因此,这绝对不是一个坏主意。另一个选择是在本地地址27.0.0.1上使用特定端口,并让流程发送到该端口,您的软件看门狗守护进程监视该端口。/dev/watchdog是用于硬件看门狗的,您的守护进程可能会维护它,以便最终如果守护进程停止,则系统将进行重置(作为最后的手段)。 - Clifford
9个回答

18
Linux软件看门狗会重新启动机器,而不仅仅是重启你的进程。
这是不正确的说法,当看门狗发出系统挂起信号后,非常有可能只需重启单个或多个进程,甚至可以中止重启或进行软重启。用户可以配置“测试”和“修复”脚本/二进制文件来执行任何想要的操作。Busybox版本的watchdog削减到近乎无法使用的水平……我猜世界永远不会知道为什么Busybox开发人员决定放弃主要功能——现在最好避免Busybox,因为它的速度改进几乎不存在,尺寸减小并不能弥补功能的巨大损失。/ bin / bash相对较小-如果尺寸很重要并且需要立即使用,可以使用标志“-Os”重新编译所有内容,以获得一个可以满足几乎所有需求的开箱即用看门狗。
哦,请不要创建自己的看门狗-那很可能会让您留下未处理的错误并使您的生活变得糟糕。

3
但是,如果看门狗信号指示系统挂起,那么这并不能确定要重新启动哪个单独的进程。这不是问题的答案——从另一个进程监视一个或多个进程是一个合法的目标,并且不能通过/dev/watchdog实现。该问题甚至没有建议创建自己的看门狗;它仅仅表明了/dev/watchdog设备和软件监控进程(或软件看门狗)之间的区别被误解了。 - Clifford
1
我认为在这里没有必要对Busybox进行负面评价,因为它们非常主观。我建议从你的回答中省略“我猜...一个人可能想要”的部分。Busybox在嵌入式系统中被广泛使用,不支持底层工具的所有功能是正常和有意的。用户应该决定他们想要Busybox实现还是原始实现,这个选择将取决于工具和上下文。 - patrickdepinguin
1
这个回答完全没有回答问题。 - ghostly_s

17
大多数Unix/Linux的init程序将为您管理守护进程并重新启动它们。请考虑将您的服务放置在/etc/inittab中。或者您可能正在使用Upstartsystemd
所有这些程序都作为PID 1运行,它们的工作是监视和重新启动系统进程。
从您的Busybox标记中,我会假设您正在运行嵌入式系统。对于这些系统,System V风格的init脚本及其所有shell脚本实际上都过于复杂了。您应该将所有这些内容删除,并用/etc/inittab或upstart或systemd任务替换它们。

嗨@Zan,感谢您的建议,我已经将"::respawn:/path/app"添加到/etc/inittab中,并在重新启动设备后成功执行了该应用程序,唯一的问题是这个条目是临时的,在重新启动设备时会自动删除。有没有办法使初始化过程永久化? - Verve Innovation
1
@ITion:它不应该是临时的。你必须在/目录中使用initrd。或者可能你有一个只读的/和一个可读写的层叠在上面。 - Zan Lynx

11

考虑使用cron吗?设置一个每分钟运行的小cron作业。使用ps检查你的应用程序是否在运行,如果没有,则重新启动它。

像这样制作一个小脚本:

#!/bin/bash
if [ ! "$(pidof myapp)" ] 
then
  /path/to/myapp &
fi

你测试进程列表中是否存在"myapp"。 "!"将测试结果取反。如果不存在,则运行"myapp"。"&"只是使其在后台启动。

将此添加到cron中。根据您的系统和偏好,有几种方法可以实现。经典的方法是使用crontab。有很多关于如何指定crontab行的文档,但你可能想要这样做:

* * * * * /path/to/the/script.sh > /dev/null

这将使你的测试在每个小时的每一分钟运行一次……你知道的。


嗨 @Janne,谢谢你的回答。但是我使用的是Busybox Linux,它没有Cron。还有其他方法吗? - Verve Innovation
那么,一个嵌入式系统。具体可用的内容取决于安装在其中的特定Linux(busybox只是许多小型系统中常用的应用程序)。如果其他方法都失败了,您可以编写一个小的C应用程序,它坐在定时循环中并监视进程列表或某个状态文件,然后在需要时重新启动您的进程。 - Janne
@Janne,是否有可能创建一个小脚本来查找进程名称,因为pid总是在变化?此致,罗伯特 - user1543106
1
busybox 可以使用 cron。 - pstanton
好主意!这也允许进行不同的检查。在我的情况下,我有一个脚本监听端口80上的请求。在一些(目前未确定的)情况下,脚本继续运行,但80端口线程已经停止...这种情况下,wget可以发挥魔力。 - undefined

4

使用/etc/inittab,您可以将其用于在特定运行级别下启动,并且如果它被杀死,它将自动重新启动。

n:2345:respawn:/path/to/app

这将使其在运行级别2345中重新启动,您可能只需要3和5,但这样做很好,并且已经内置于Linux中。

2
如果你正在使用systemd,那么有两个看门狗:一个是针对硬件的(可以使用systemd.conf或watchdog守护程序),另一个是针对作为服务初始化的守护进程。如果你选择使用systemd,请查看以下内容:http://0pointer.de/blog/projects/watchdog.html

2
这里有看门狗的文档:http://linux.die.net/man/8/watchdog。但是,听起来这并不是你想要的。Linux软件看门狗会重新启动机器,而不仅仅是重启你的进程。你可以很容易地制作自己的看门狗。例如,你可以定期编写一些临时文件,并启动一个脚本,定期检查该文件是否更新,如果已经达到一定时间,则重新启动你的进程。

1
您可以使用“Monit”实用程序来重新启动和监视您的服务。只需通过命令“apt-get install monit”进行安装。

0
如果有人来到这个页面寻找操作系统看门狗(这并不是OP想要的直接答案),那么你需要的是:
sudo apt-get install watchdog
service watchdog status
service watchdog start 

要检查它是否工作,请执行以下操作:

tail -f /var/log/syslog | grep watchdog

你应该看到类似这样的东西:

Jul 25 22:03:35 nuc watchdog[14229]: still alive after 733 interval(s)
Jul 25 22:03:36 nuc watchdog[14229]: still alive after 734 interval(s)
Jul 25 22:03:36 nuc watchdog[14229]: still alive after 735 interval(s)
Jul 25 22:03:37 nuc watchdog[14229]: still alive after 736 interval(s)
Jul 25 22:03:37 nuc watchdog[14229]: still alive after 737 interval(s)

希望我回答问题是正确的。所有其他答案似乎都非常不同。


-3

您可以尝试使用wdog,这是一个用C++编写的实用程序,链接到Kahless_9框架。您可以从https://github.com/zepher999/wdog下载此源代码,并相应地更新以适合您自己的需求。未来仍需要进行一些TODO列表更改,但目前应该满足您的当前要求。

该实用程序需要一个csv文件作为输入,其中包含所有要监视的进程及其参数。在启动时,实用程序启动csv文件中指定的所有这些进程,并监视它们的退出/终止情况,然后重新启动进程。

目前,wdog允许停止/杀死受监视的进程,以及以热或冷模式启动实用程序的能力。热模式允许实用程序使用缓存记录来监视已经启动的进程,而冷模式启动则丢弃这些缓存值,因此尝试启动所有进程。

该实用程序还具有启动自身实例以监视自身的能力,从而拥有一个看门狗来监视看门狗。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接