Pergunta

Eu estou escrevendo um monitor do sistema para Linux e quiser incluir algumas funcionalidades cão de guarda. No kernel, você pode configurar o cão de guarda para continuar mesmo que / dev / watchdog está fechado. Em outras palavras, se as minhas saídas daemon normalmente e fecha / dev / watchdog, o sistema ainda re-boot de 59 segundos mais tarde. Isso pode ou não ser um comportamento desejável para o usuário.

Eu preciso fazer o meu daemon ciente dessa configuração porque vai influenciar a forma como eu lidar com SIGINT. Se a configuração estiver ativada, o meu daemon precisaria (de preferência) iniciar um encerramento ordenado na saída ou (pelo menos) avisar o usuário de que o sistema vai reiniciar em breve.

Alguém sabe de um método para obter esta definição de espaço do usuário? Eu não vejo nada em sysconf () para obter o valor. Da mesma forma, eu preciso ser capaz de dizer se o cão de guarda software está habilitado para começar.

Editar:

Linux fornece uma interface cão de guarda muito simples. Um processo pode abrir / dev / cão de guarda, uma vez que o dispositivo é aberto, o kernel começará a 60 segundo contagem regressiva para reiniciar a menos que alguns dados são escritos para o arquivo, caso em que o relógio re-sets.

Dependendo de como o kernel está configurado, fechando esse arquivo pode ou não pode parar a contagem decrescente. A partir da documentação:

A agência pode ser interrompido sem causando uma reinicialização se o dispositivo / Dev / watchdog está fechada corretamente, a menos que o seu kernel é compilado com a opção CONFIG_WATCHDOG_NOWAYOUT habilitado.

Eu preciso ser capaz de dizer se CONFIG_WATCHDOG_NOWAYOUT foi criado a partir de um daemon do espaço do usuário, para que eu possa lidar com o desligamento da referida daemon de forma diferente. Em outras palavras, se essa configuração é alta, um simples:

# /etc/init.d/mydaemon stop

... seria reiniciar o sistema em 59 segundos, porque nada está escrevendo para / dev / watchdog por mais tempo. Então, se sua alta set, minha rotina de tratamento para SIGINT precisa fazer coisas adicionais (ou seja, avisar o usuário, pelo menos).

Não consigo encontrar uma maneira de obter essa configuração de espaço do usuário :( Qualquer ajuda é apreciada.

Foi útil?

Solução

AHA! Depois de cavar através linux/watchdog.h e drivers/watchdog/softdog.c do kernel, eu era capaz de determinar as capacidades da interface softdog ioctl(). Olhando para as capacidades que anuncia em struct watchdog_info:

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

não apoiar uma mágica perto que (parece) override CONFIG_WATCHDOG_NOWAYOUT. Assim, quando terminar normalmente, eu tenho que escrever um único char 'V' para /dev/watchdog seguida, close-lo, e o temporizador irá parar a contagem.

Um simples ioctl() em um descritor de arquivo para /dev/watchdog WDIOC_GETSUPPORT pedindo permite determinar se esta bandeira está definido. pseudo-código:

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.
}

Ao trabalhar com cães de guarda de hardware, você pode querer abrir com O_NONBLOCK tão ioctl() blocos não open() (daí detectar um cartão de ocupado).

Se WDIOF_MAGICCLOSE não é suportado, deve-se apenas supor que o cão de guarda macio é configurado com NOWAYOUT. Lembre-se, apenas abertura o dispositivo é iniciado com êxito a contagem regressiva. Se tudo que você está fazendo está sondando para ver se ele suporta perto magia e isso acontecer, então close mágica it . Caso contrário, certifique-se de lidar com o fato de que agora você tem um cão de guarda em execução.

Infelizmente, não há nenhuma maneira real de saber com certeza sem realmente iniciá-lo, pelo menos não que eu poderia encontrar.

Outras dicas

um cão de guarda protege contra falha no disco de bloqueio do sistema, seja por causa de uma falha de software ou hardware.

O que você precisa é um daemon de monitoramento daemon (DMD). check 'monit'

Eu acho que os drivers de dispositivo de vigilância são realmente destinado ao uso em plataformas embarcadas (ou pelo menos os bem controlados), onde os desenvolvedores terão controle de qual kernel está em uso.

Esta poderia ser considerado um descuido, mas eu acho que não é.

Uma outra coisa que você pode tentar, se o cão de guarda foi construído como um módulo carregável, descarregá-lo presumivelmente anular o desligamento?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top