有没有类似的命令
vi > out
vi | out
我可以用它来重置我的嵌入式 Linux 设备的看门狗吗?
答案1
如果您的系统上有一个看门狗并且有一个使用 的驱动程序/dev/watchdog
,那么您所要做的就是终止为其提供数据的进程;如果没有这个过程,那么你可以touch /dev/watchdog
打开一次,如果你不再触摸它,它就会重置。
您可能还对使用“magic sysrq”方式重置设备感兴趣。如果您的内核已CONFIG_MAGIC_SYSRQ
编译了该功能,则可以echo 1 > /proc/sys/kernel/sysrq
启用它,然后echo b > /proc/sysrq-trigger
重新启动。当您执行此操作时,它会立即重新启动,而无需卸载或同步文件系统。
答案2
如果您认为看门狗运行正常,并且想要测试它是否确实能够恢复崩溃的系统,那么您可以通过使用“magic sysrq”使系统因内核恐慌而崩溃,从而比 Shawn 的答案更好。首先同步文件系统是个好主意,因此请以 root 身份执行以下操作:
sync; sleep 2; sync; echo c > /proc/sysrq-trigger
如果启用了 sysrq,这应该会导致内核恐慌。然后,如果您等待大约 60 秒(看门狗模块的典型超时),您应该会看到机器重新启动。请注意,这仅适用于硬件看门狗,不适用于“软狗”模块。
答案3
终止看门狗进程是一种方法,但请注意,这并不是万无一失的:行为取决于特定的看门狗驱动程序,请参阅内核文档,特别是关于“Magic Close”和CONFIG_WATCHDOG_NOWAYOUT
.根据内核配置的不同,答案sysrq
也可能会给您带来误报 ( CONFIG_PANIC_TIMEOUT
)。
我认为最直接的方法是编写自己的、简单且故意破坏的看门狗。以下程序(基于内核中包含的示例)对我有用:
// SPDX-License-Identifier: GPL-2.0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>
int main(void)
{
int fd = open("/dev/watchdog", O_RDWR);
if (fd == -1) {
perror("watchdog");
exit(EXIT_FAILURE);
}
int timeout;
ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
printf("The timeout was %d seconds\n", timeout);
timeout = 1;
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
printf("The timeout is now %d seconds. The system should reset soon...\n", timeout);
while (1) {
printf("Still here...\n");
sleep(1);
}
}
像例如一样运行它gcc prog.c && sudo sync && sudo ./a.out
。
答案4
只需将其放在前两篇文章的一行中即可:
echo 1 | sudo tee -a /proc/sys/kernel/sysrq; sync; sleep 2; sync; echo c | sudo tee -a /proc/sysrq-trigger