簡體   English   中英

從用戶空間,如何判斷Linux的軟看門狗是否配置了無路可走?

[英]From userspace, how can I tell if Linux's soft watchdog is configured with no way out?

我正在為 Linux 編寫一個系統監視器,並希望包含一些看門狗功能。 在內核中,您可以將看門狗配置為即使 /dev/watchdog 關閉也能繼續運行。 換句話說,如果我的守護進程正常退出並關閉 /dev/watchdog,系統仍會在 59 秒后重新啟動。 這可能是也可能不是用戶想要的行為。

我需要讓我的守護進程知道這個設置,因為它會影響我處理 SIGINT 的方式。 如果設置打開,我的守護進程需要(最好)在退出時有序關閉或(至少)警告用戶系統將很快重新啟動。

有誰知道從用戶空間獲取此設置的方法? 我在 sysconf() 中看不到任何內容來獲取該值。 同樣,我需要能夠判斷軟件看門狗是否已啟用。

編輯:

Linux 提供了一個非常簡單的看門狗接口。 一個進程可以打開 /dev/watchdog ,一旦設備打開,內核將開始倒計時 60 秒重新啟動,除非一些數據寫入該文件,在這種情況下時鍾會重置。

根據內核的配置方式,關閉該文件可能會也可能不會停止倒計時。 從文檔:

如果設備 /dev/watchdog 正確關閉,則可以停止看門狗而不會導致重新啟動,除非您的內核是在啟用 CONFIG_WATCHDOG_NOWAYOUT 選項的情況下編譯的。

我需要能夠判斷 CONFIG_WATCHDOG_NOWAYOUT 是否是從用戶空間守護程序中設置的,以便我可以以不同的方式處理所述守護程序的關閉。 換句話說,如果該設置很高,一個簡單的:

# /etc/init.d/mydaemon stop

...將在 59 秒內重新啟動系統,因為沒有任何內容再寫入 /dev/watchdog。 所以,如果它設置的很高,我的 SIGINT 處理程序需要做一些額外的事情(即至少警告用戶)。

我找不到從用戶空間獲取此設置的方法:( 任何幫助表示贊賞。

啊哈! 在深入研究內核的linux/watchdog.hdrivers/watchdog/softdog.c ,我能夠確定 softdog ioctl()接口的功能。 查看它在struct watchdog_info宣布的功能:

static struct watchdog_info ident = {
                .options =              WDIOF_SETTIMEOUT |
                                        WDIOF_KEEPALIVEPING |
                                        WDIOF_MAGICCLOSE,
                .firmware_version =     0,
                .identity =             "Software Watchdog",
        };

確實支持(似乎)覆蓋CONFIG_WATCHDOG_NOWAYOUT的魔術關閉。 因此,在正常終止時,我必須向/dev/watchdog寫入一個字符“V”,然后關閉它,計時器將停止計數。

一個簡單的ioctl()文件描述符到/dev/watchdog詢問WDIOC_GETSUPPORT允許人們確定是否設置了此標志。 偽代碼:

int fd;
struct watchdog_info info;

fd = open("/dev/watchdog", O_WRONLY);
if (fd == -1) {
   perror("open");
   // abort, timer did not start - no additional concerns
}

if (ioctl(fd, WDIOC_GETSUPPORT, &info)) {
    perror("ioctl");
    // abort, but you probably started the timer! See below.
}

if (WDIOF_MAGICCLOSE & info.options) {
   printf("Watchdog supports magic close char\n");
   // You have started the timer here! Handle that appropriately.
}

使用硬件看門狗時,您可能希望使用O_NONBLOCK打開,因此ioctl()不會open()阻塞(因此檢測到忙卡)。

如果不支持WDIOF_MAGICCLOSE ,則應假設軟看門狗配置為 NOWAYOUT。 請記住,只需成功打開設備即可開始倒計時。 如果您所做的只是探索它是否支持 magic close 並且確實如此,那么magic close it 否則,一定要處理這樣一個事實,即您現在有一個正在運行的看門狗。

不幸的是,沒有真正啟動它就沒有真正的方法可以確定,至少我找不到。

看門狗可防止由於軟件崩潰或硬件故障而硬鎖定系統。

你需要的是一個守護進程監控守護進程(dmd)。 檢查“監控”

我認為看門狗設備驅動程序真正用於嵌入式平台(或至少是控制良好的平台),開發人員可以在其中控制正在使用的內核。

這可以被認為是一種疏忽,但我認為它不是。

您可以嘗試的另一件事是,如果看門狗是作為可加載模塊構建的,卸載它可能會中止關閉?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM