chamando sigprocmask do bash

5

Eu tenho um processo que gera um comando bash com system() enquanto a máscara de sinal tem todos os sinais bloqueados. Isso não pode ser corrigido facilmente.

O comando bash eventualmente exec s em um processo. A máscara do sinal todo bloqueado é herdada do processo original através do bash para o processo final, então no final eu recebo um processo que é "imune" a todos os sinais (exceto é claro SIGKILL , SIGSTOP , etc).

A solução alternativa seria redefinir sigprocmask do bash, mas não consigo encontrar nenhum comando relacionado. É possível fazer?

    
por Lorenzo Pistone 08.04.2014 / 19:07

1 resposta

5

Não parece haver uma solução pura.

O Ksh (tanto o ksh93 quanto o mksh) desbloqueia todos os sinais (testados no Debian wheezy), então se você puder usar o ksh ao invés do bash, ele resolverá o seu problema.

Se você não puder alterar o fato de que o bash é chamado, você poderá fazer o bash executar o ksh e fazer o ksh executar o processo filho: replace

bash -c '…; exec child_process'

por

bash -c '…; exec ksh -c "exec child_process"'

Cuidado com as questões citadas!

O Ksh é rápido e fácil de usar, mas muitas vezes não faz parte da instalação padrão. Se isso for um problema, você pode usar o Perl, que é parte da instalação padrão na maioria dos sistemas Linux não embarcados.

perl -e '
    use POSIX;
    $s = POSIX::SigSet->new(); $s->fillset();
    sigprocmask(1, $s, $s) or die $!;    # 1 = SIG_UNBLOCK
    exec "child_process"'
    
por 10.04.2014 / 03:37

Tags