Existe uma ferramenta de linha de comando para gerenciar sinais unix?

5

Existe um executor de comandos como env , nice , nohup , etc., que pode executar um programa com sinais modificados? No meu caso, preciso de algo para redefinir SIGINT para SIG_DFL .

Por que preciso disso? Porque não-interativo bash define SIG_IGN para SIGINT para processos em segundo plano e você não pode redefini-la com o shell integrado trap : link

upd: no bash 4.3 background subshell não ignora o SIGINT, outros programas em segundo plano ainda fazem

link

h. Fixed a bug that caused SIGINT and SIGQUIT to not be trappable in asynchronous subshell commands.

    
por basin 02.07.2015 / 20:29

1 resposta

4

Não há. Muito fácil escrever um com perl. Aqui está o script untrap :

#!/usr/bin/perl
$SIG{INT} = "DEFAULT";
exec { $ARGV[0] } @ARGV or die "couldn't exec $ARGV[0]: $!";

Exemplo de uso:

#!/bin/bash
untrap bash -c '
    sleep 3
    echo aaa
' &
trap '' INT
wait $!

Se você remover o prefixo untrap , Ctrl-C não eliminará o script.

Roteiro mais versátil:

#!/usr/bin/perl

use Getopt::Long;

GetOptions(
    'help' => sub {
        print "usage: $0 [--sig={INT|HUP|...}={IGNORE|DEFAULT}]... COMMAND [ARG]...\n";
        exit 0;
    },
    'sig=s%' =>
    sub {
        my $action = $_[2];
        my $signame = $_[1];
        die "bad action $action" unless ($action eq "IGNORE" or $action eq "DEFAULT");
        die "bad signame $signame" if ($signame eq "__DIE__" or $signame eq "__WARN__");
        $SIG{$_[1]} = $action;
    }) or exit 1;

exec { $ARGV[0] } @ARGV or die "couldn't exec $ARGV[0]: $!";
    
por 03.07.2015 / 13:10