Programa Perl no Solaris mostra bloqueado SIG TERM

0

Configuração:

Operating system: Solaris 10
Perl version: v5.8.4 built for i86pc-solaris-64int

Contexto:

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.

O problema:

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?

Código do manipulador de sinal Perl:

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); }
}
    
por ata 26.01.2017 / 15:41

0 respostas