Operating system: Solaris 10
Perl version: v5.8.4 built for i86pc-solaris-64int
Eu tenho dois sistemas que executam a mesma versão do Solaris e a mesma versão do Perl (embora um tempo de compilação e patches mais antigos). Nesse sistema, posso executar vários programas perl, todos eles supervisionados. O supervisor possui muitos subsistemas e um deles é responsável pela execução desses scripts perl (muitos podem ser). Quando eu desligo o supervisor graciosamente, ele envia um sinal TERM para todos os processos filhos, para que eles possam fazer a limpeza de forma adequada.
Em um sistema, não tenho nenhum problema (aquele que está executando o Perl build - mesma versão). Quando o supervisor encerra, todas as crianças e seus filhos recebem SIG TERM e limpam bem.
Neste novo sistema, recebo este estado de bloqueio, embora o script perl seja o mesmo.
Quando eu envio SIG TERM
para o processo pai, o programa filho (perl) não recebe o sinal TERM para que não seja possível limpar (fechar arquivos e conexões).
psig <process-id>
mostra:
TERM blocked,caught Perl_csighandler 0
Se eu executar o script perl a partir da linha de comando, tudo funcionará bem. psig
mostra
TERM caught Perl_csighandler 0
Alguém sabe o que é esse estado bloqueado? Por que estou recebendo esse estado? Eu tentei o mesmo com uma versão mais antiga da mesma versão perl e funcionou sem problemas. Existe alguma diferença na biblioteca? Como posso depurar este problema?
Aqui está o código para registrar e manipular sinais
my $term = 0;
$SIG{'TERM'} = 'signalHandler';
sub signalHandler {
my ($sig) = @_;
if (!$writing) {
LogWrite("Signal $sig received, closing down now.\n");
closeDown(0);
} else {
# If writing to file, then close down later after write is complete.
LogWrite("Signal $sig received, closing down later.\n");
$term = $sig;
}
}
sub closeDown ($) {
my ($exit_code) = @_;
LogWrite("Exiting with code $exit_code.\n");
LogWrite("Closing opened files...\n");
closeLogFile();
exit($exit_code);
}
sub closeLogFile {
if ( fileno (LOGFILE)) { close(LOGFILE); }
}