Наблюдение за программным обеспечением Linux

Я пишу системный монитор для Linux и хочу включить некоторые функции сторожевого таймера. В ядре вы можете настроить сторожевой таймер на продолжение, даже если /dev/watchdog закрыт. Другими словами, если мой демон нормально завершает работу и закрывает /dev/watchdog, система будет перезагружаться через 59 секунд. Это может или не может быть желательным поведением для пользователя.

Мне нужно, чтобы мой демон узнал об этом параметре, потому что это повлияет на то, как я обрабатываю SIGINT. Если настройка включена, моему демону необходимо (желательно) начать упорядоченное завершение при выходе или (по крайней мере) предупредить пользователя о том, что система скоро перезагрузится.

Кто-нибудь знает о способе получения этого параметра из пользовательского пространства? Я ничего не вижу в sysconf(), чтобы получить значение. Аналогично, мне нужно узнать, разрешено ли сторожевому таймеру программного обеспечения.

Edit:

Linux предоставляет очень простой интерфейс сторожевого таймера. Процесс может открыть /dev/watchdog, как только устройство будет открыто, ядро ​​начнет отсчет 60 секунд до перезагрузки, если в этот файл не будут записаны некоторые данные, и в этом случае часы будут повторно установлены.

В зависимости от того, как настроено ядро, закрытие этого файла может или не может остановить обратный отсчет. Из документации:

Наблюдатель может быть остановлен без вызывая перезагрузку, если устройство /dev/ сторожевой таймер закрыт правильно, если ваше ядро ​​не скомпилировано с опция CONFIG_WATCHDOG_NOWAYOUT включен.

Мне нужно узнать, был ли установлен CONFIG_WATCHDOG_NOWAYOUT из демонстрантов пользовательского пространства, чтобы я мог по-разному обрабатывать выключение этого демона. Другими словами, если эта настройка высока, просто:

# /etc/init.d/mydaemon stop

... перезагрузит систему за 59 секунд, потому что ничего больше не записывает в /dev/watchdog. Таким образом, если его набор высокий, мой обработчик для SIGINT должен делать дополнительные вещи (т.е. Предупреждать пользователя как минимум).

Я не могу найти способ получить этот параметр из пользовательского пространства:( Любая помощь приветствуется.

Ответы

Ответ 1

AHA! После перекопа через ядро ​​ linux/watchdog.h и drivers/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. Поэтому, когда вы заканчиваете нормально, я должен написать один char 'V' до /dev/watchdog , затем закрыть его, а таймер перестанет считаться.

Простой 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() not open() блоки (следовательно, обнаружив занятую карту).

Если WDIOF_MAGICCLOSE не поддерживается, следует просто предположить, что мягкий сторожевой таймер настроен с помощью NOWAYOUT. Помните, что только открытие устройства успешно запускает обратный отсчет. Если все, что вы делаете, пытается проверить, поддерживает ли он магию, и это делает, тогда магия закрывает ее. В противном случае убедитесь, что у вас есть работающий сторожевой таймер.

К сожалению, нет никакого реального способа узнать наверняка, не начав его, по крайней мере, не так, чтобы я мог найти.

Ответ 2

сторожевой таймер защищает от жесткой блокировки системы из-за сбоя программного обеспечения или аппаратного сбоя.

вам нужен демон демон демон (dmd). проверьте 'monit'

Ответ 3

Я думаю, что драйверы сторожевого устройства действительно предназначены для использования на встроенных платформах (или, по крайней мере, в хорошо контролируемых), где разработчики будут контролировать, какое ядро ​​используется.

Это можно считать надзором, но я думаю, что это не так.

Еще одна вещь, которую вы могли бы попробовать, если бы сторожевой таймер был построен как загружаемый модуль, разгрузка его, по-видимому, прекратит выключение?