비슷한 명령어가 있나요?
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의 대답보다 더 나은 결과를 얻을 수 있습니다. 먼저 파일 시스템을 동기화하는 것이 좋으므로 루트로 다음을 수행하십시오.
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