【问题标题】:watchdog: Device or resource busy看门狗:设备或资源繁忙
【发布时间】:2015-05-27 13:37:29
【问题描述】:

我正在尝试为看门狗设备提供数据——Raspbian 中的/dev/watchdog——来自 C。

问题是无论我如何尝试访问设备总是会抛出繁忙或权限被拒绝错误(因为进程已经在运行并由系统提供......)。

watchdog API 中说'..驱动程序不会禁用 看门狗,除非已将特定的魔术字符“V”发送到 /dev/watchdog 就在关闭文件之前。' 但我又不能/dev/watchdog..我试过了:

echo V > /dev/watchdog //bash, /dev/watchdog: Permission denied

open("/dev/watchdog", O_WRONLY); //C, Device or resource busy

有什么方法可以释放设备,以便我可以从 C 控制心跳?

【问题讨论】:

  • fuser -v /dev/watchdog 说什么?
  • 什么都没有,就是空的。
  • 您是否以 root 身份运行 echo V > /dev/watchdog?至于程序,你是不是打开文件就关闭了?
  • 我知道这已经有一段时间了,但从来没有解决这个问题并且仍然感兴趣。 @CJxD 是的,以 root 身份回显和执行程序。
  • @CJxD:我有同样的问题:crw------- 1 root root 10, 130 Mar 17 08:15 /dev/watchdog

标签: c linux raspberry-pi watchdog


【解决方案1】:

我在使用 Raspberry Pi 时遇到了这个问题。我的应用程序使用了大量的 CPU 时间。经过 1 或 2 天的工作,它导致 Raspberry pi 挂起。所以我决定使用wtchdog。当我想从 C++ 程序编写看门狗设备时,我遇到了同样的错误。

我找到的解决方案:

打开一个新的规则文件 sudo nano /etc/udev/rules.d/60-watchdog.rules

并将这一行添加到文件中 KERNEL=="watchdog", MODE="0666"

在此之后,我能够从终端屏幕或 c++ 程序访问看门狗。

【讨论】:

  • 我现在不能尝试,但如果它有效,这就是黄金。非常感谢您,我会及时通知您。
  • 对我不起作用:仍然是“设备或资源繁忙”。 @TMichel:你有什么进展吗?
  • 这实质上是向系统上的每个人开放读写权限(如果您关心安全性,这是个坏主意)。如果您打算这样做,请执行KERNEL=="watchdog", MODE="0660", GROUP="watchdog" 之类的操作并将您的用户添加到watchdog 组。理想情况下,这应该与 root 一起使用......
  • @CJxD:我知道它会更改文件权限。它确实如此。但这无济于事。我已经尝试了在“c”中打开文件的非常简单的代码:int fd = open("/dev/watchdog", O_WRONLY); 从根目录运行它。得到同样的错误。看起来错误来自“打开”函数。
【解决方案2】:

为什么会出现“设备或资源繁忙”错误

我发现的问题是 systemd 和 wd_keepalive 似乎在使用每个 fuser 输出的看门狗资源:

>sudo fuser -v /dev/watchdog
                     USER        PID ACCESS COMMAND
/dev/watchdog:       root      15087 F.... wd_keepalive

>sudo fuser -v /dev/watchdog
                     USER        PID ACCESS COMMAND
/dev/watchdog:       root          1 F.... systemd

修复忙碌错误

我从/etc/systemd/system.conf 中删除了看门狗定时器引用,以摆脱systemd 繁忙系统上的繁忙问题。

如果你觉得大胆,你可以杀死 -9 你的 wd_keepalive PID,然后将你的角色回显到/dev/watchdog 设备,如果你想手动控制看门狗。我更喜欢让守护进程做它的事情。

在运行 Stretch 12/17/18 的 Pi 上运行的看门狗设置

与 SO 和网络上的其他一些建议不同,我不需要在 Pi 上安装看门狗作为设备,例如在/boot/config.txt。除了通过 systemctl 之外,我也不需要调用任何服务。我刚刚跑了

sudo apt-get install watchdog
sudo update-rc.d watchdog defaults

然后配置看门狗我把这些行放在/etc/watchdog.conf

watchdog-device = /dev/watchdog

# Set default Timeout
watchdog-timeout         = 14

运行看门狗

然后我需要做的唯一一件事就是从我的应用程序中调用它,我在启动后运行它:

sudo systemctl enable watchdog
sudo systemctl start watchdog
sudo systemctl -l status watchdog

【讨论】:

  • 删除/etc/systemd/system.conf 中对看门狗的引用然后重新启动,在 Ubuntu 16.04 中为我解决了这个问题。谢谢。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2016-08-29
  • 2015-09-24
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2022-12-03
  • 2020-11-04
相关资源
最近更新 更多