... don't panic!
Não, ainda não é o dia da toalha! Mas este post trata do pânico do núcleo de um sistema operacional. No Windows, conhecido como "tela azul da morte"... ok, não acontece só no Windows; no Unix também pode existir uma situação de travar o SO (tudo bem... é muito menos frequente e por motivos bem justificados). No Unix chama-se Kernel Panic!
Qualquer SO pode se encontrar em uma situação sem saída e, quando isto acontece, o sistema pode perder dados e entrar em um processo de instabilidade. Então para não perder dados ou danificar mais o SO ele para e espera ser reiniciado. Existe uma rotina, nos sistemas Unix e Linux que se chama panic(); ela exibe uma mensagem no console e grava uma imagem da memória do kernel na situação de emergência para ser depurada (debuged) numa outra ocasião.
Mas o que causa o pânico? Um erro de hardware ou mesmo de software, uma memória corrompida fisicamente ou por algum programa etc. causam uma situação de emergência e o sistema chama a função panic().
O código básico da função é:
char *panicstr;
char *s;
{
panicstr = s;
update();
printf("panic: %s\n", s);
for(;;)
idle();
}
O "for(;;;)" é o loop em que o sistema entra para esperar pelo reboot! Antigamente, no Multics, grande parte do código do sistema tinha tratamento de excessões e correção de erros. No Unix, Ken Thompson e Denis Ritchie resolveram de modo mais simples: em caso de erro, emita uma mensagem de "Kernel Panic" e entre em loop. Assim, se houver uma falha de hardware ou mesmo um erro de software que desestabilize o sistema, ele para e emite a mensagem.
Nos kernels atuais, além da mensagem de erro e da parada em loop, o SO faz uma cópia da memória do sistema na hora que ocorre o problema. Esta cópia pode ser gravada em um arquivo para posterior análise e identificação do problema [1].
Apesar de ser uma rotina segura e importante, quando ela acontece em um servidor, se transforma em um problema. Pode ser desejável ativar uma reinicialização automática. Para isso, basta acrescentar a linha:
kernel.panic = 60
no arquivo /etc/sysctl.conf salvar e reiniciar o processo com "sysctl -p". Isto fará com que o servidor reinicie em 1 minuto após um kernel panic! Se quiser testar podes simular um pânico:
# sync
# echo c > /proc/sysrq-trigger
Note que o 'c' tem que ser minúsculo e use com cuidado. Isto forçará um kernel panic e o computador reiniciará em um minuto, se o arquivo sysctl.conf foi configurado para isso.
OK ... e não esqueça a toalha!
Referências
[1] Novel.Com "Configure kernel core dump capture"
http://www.novell.com/support/search.do?cmd=displayKC&docType=kc&externalId=3374462&sliceId=SAL_Public