Unix信号を管理するためのコマンドラインツールはありますか?

Unix信号を管理するためのコマンドラインツールはありますか?

env修正された信号実行プログラムを使用できるなどniceのコマンド実行プログラムはありますか?nohup私の場合は何かSIGINTSIG_DFL

なぜこれが必要ですか?バックグラウンドプロセスの非対話型設定のため、組み込みbashシェルを使用してリセットすることはできません。SIG_IGNSIGINTtraphttps://bugs.debian.org/cgi-bin/bugreport.cgi?bug=573780

upd:SIGINTはbash 4.3バックグラウンドサブシェルでは無視されず、他のバックグラウンドプログラムはまだそれを無視します。

http://tiswww.case.edu/php/chet/bash/CHANGES

時間。非同期サブシェルコマンドでSIGINTとSIGQUITがキャプチャされないバグを修正しました。

答え1

いいえ。 Perlで書くのは簡単です。untrapスクリプトは次のとおりです。

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

使用例:

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

プレフィックスが削除されると、untrapCtrl-Cはスクリプトを終了しません。

より一般的なスクリプト:

#!/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]: $!";

関連情報