如何使用 Linux 软件看门狗?

Posted

技术标签:

【中文标题】如何使用 Linux 软件看门狗?【英文标题】:How to use Linux software watchdog? 【发布时间】:2012-02-22 18:41:31 【问题描述】:

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

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

我在谷歌上搜索了一下,发现 Linux 在/dev/watchdog 有看门狗,但不知道如何使用它。有人可以帮我举个例子吗?

我的问题是在哪里指定我的应用程序名称和重启延迟时间间隔?

【问题讨论】:

据我所知,这只能确保整个系统没有挂起并在挂起时重置。我不认为你可以用它来保持用户态应用程序的活力。 我有使用嵌入式 Linux 应用程序中的工具的经验,它可以满足您的要求,不幸的是,我不记得它的名称,否则我会发布答案,但我知道它更有效 - 或者-less 正如你在任何情况下所建议的那样,所以这根本不是一个坏主意。另一种选择是使用本地主机地址 27.0.0.1 上的特定端口,并让进程发送到它,并且您的软件看门狗守护程序监视它。 /dev/watchdog 用于硬件看门狗,您的守护程序可能会维护它,因此最终如果守护程序停止,系统会重置(作为最后的手段)。 【参考方案1】:

linux 软件看门狗会重启机器,而不仅仅是重启你的进程。

这根本不是真的,很可能在看门狗发出系统挂起信号后重新启动单个或多个进程 - 您甚至可以中止重新启动或进行软重新启动,一个能够配置“测试" 和 "repair" - 脚本/二进制文件可以做任何你想让他们做的事情。看门狗的busybox版本被剥离到几乎无法使用的水平......我想世界永远不会知道为什么busybox开发者决定放弃主要功能 - 现在,最好完全避免busybox - > 速度改进几乎不存在,尺寸减小并不能弥补功能上的巨大损失。 /bin/bash 相当小 - 如果大小很重要并且你很高兴,则使用标志“-Os”重新编译所有内容 - 一个开箱即用的看门狗,它几乎可以满足人们想要的一切。

哦,请不要创建您自己的看门狗 - 这很可能会给您留下未处理的错误,并且有一天会让您的生活变得糟糕。

【讨论】:

但是,如果看门狗发出 系统 挂起信号,则不会识别要重新启动的单个进程。这不是问题的答案——监控另一个进程的一个或多个进程是一个合理的目标,而不是通过 /dev/watchdog 实现的目标。这个问题甚至没有建议创建自己的看门狗;它只是说明了对 /dev/watchdog 设备和软件监控进程(或软件看门狗)之间区别的误解。【参考方案2】:

大多数 Unix/Linux init 程序将为您管理守护程序并重新启动它们。考虑将您的服务放在/etc/inittab。或者您可能正在使用Upstartsystemd

所有这些程序都以PID 1 运行,它们的工作是监视和重新启动系统进程。

根据您的 Busybox 标签,我假设您正在运行嵌入式系统。在这些方面,带有所有 shell 脚本的 System V 风格的初始化脚本真的是矫枉过正。您可能应该删除所有这些内容并将其替换为 /etc/inittab 或 upstart 或 systemd 作业中的条目。

【讨论】:

嗨@Zan 感谢您的输入,我在 /etc/inittab 中添加了“::respawn:/path/app”,并且应用程序在重新启动设备后执行良好,唯一的问题是这个条目是临时的,并在重新启动设备时自动删除。有什么方法可以使初始化过程永久化。 @ITion:它不应该是临时的。您必须为您的/ 目录使用initrd。或者你可能有一个只读的/ 和一个分层的读写。【参考方案3】:

使用 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 感谢您的回答。但是我使用的 linux 是 Busybox 并且它没有 Cron 。有没有其他办法。 那么,嵌入式系统。确切的可用内容取决于安装在其上的特定 linux(busybox 只是许多小型系统中常用的应用程序)。如果所有其他方法都失败了,您始终可以编写一个小型 c 应用程序,该应用程序位于定时循环中并监控您的应用程序写入的进程列表或某些状态文件,然后在需要时重新启动您的进程。 @Janne 是否可以创建一个小脚本来查找进程名称,因为 pid 总是在变化?亲切的问候,罗伯特 busybox 有/可以有 cron【参考方案4】:

使用/etc/inittab你可以利用它在特定的运行级别启动,如果它被杀死它会自动重启

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

这将使它在运行级别 2345 中重新生成,您可能只需要 3 和 5 但这将正常工作并且内置在 Linux 中。

【讨论】:

【参考方案5】:

看门狗的文档在这里:http://linux.die.net/man/8/watchdog

但这听起来不是你想要的。 linux 软件看门狗会重启机器,而不仅仅是重启你的进程。

您可以轻松制作自己的看门狗。例如,您可以让您的程序定期编写一些临时文件,并启动一个脚本,该脚本不时检查该文件并在一段时间未更新时重新启动您的进程。

【讨论】:

【参考方案6】:

如果您使用 systemd,则有 2 个看门狗:一个用于硬件(使用 systemd.conf 或使用看门狗守护程序),另一个用于初始化为服务的守护程序。 如果 systemd 是您的选择,请查看以下内容: http://0pointer.de/blog/projects/watchdog.html

【讨论】:

【参考方案7】:

您可以使用“监控”实用程序来重新启动和监控您的服务。 只需发出命令“apt-get install monit”即可安装。

【讨论】:

【参考方案8】:

如果有人来到这个页面寻找操作系统看门狗(这不是 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)

我希望我能正确回答这个问题。所有其他答案似乎都大不相同。

【讨论】:

【参考方案9】:

您可以尝试 wdog,它是一个用 c++ 编写的实用程序,并链接到 Kahless_9 框架。可以从以下位置下载源代码:https://github.com/zepher999/wdog,然后根据您自己的需要进行更新。将来仍然需要对 TODO 列表进行一些更改,但这应该可以满足您当前的要求。

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

目前 wdog 允许停止/终止受监控的进程,以及在热模式或冷模式下启动实用程序的能力。热模式允许实用程序使用缓存记录来监控已经启动的进程,而冷模式启动会丢弃这些缓存值,从而尝试启动所有进程。

该实用程序还能够启动自己的实例来监控自己,从而为看门狗提供看门狗。

【讨论】:

以上是关于如何使用 Linux 软件看门狗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux RedHat OS 中使用 O-Profile => 与 NMI 看门狗冲突

Linux 软件看门狗 watchdog 喂狗

linux 嵌入式看门狗使用

禁用硬件看门狗后使用超级终端的哪种协议来烧写spl

如何使用看门狗监视在Python中创建或删除的文件的时间

嵌入式软件设计(看门狗)