有管理unix信号的命令行工具吗?

有管理unix信号的命令行工具吗?

env是否有像、nice、等命令运行nohup程序可以使用修改后的信号运行程序?就我而言,我需要将一些东西重置SIGINTSIG_DFL.

为什么我需要这个?因为后台进程的非交互式bash设置,您无法使用内置的 shell 重置它:SIG_IGNSIGINTtraphttps://bugs.debian.org/cgi-bin/bugreport.cgi?bug=573780

upd:在 bash 4.3 后台子 shell 中不会忽略 SIGINT,其他后台程序仍然会忽略

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

H。修复了导致 SIGINT 和 SIGQUIT 无法在异步子 shell 命令中捕获的错误。

答案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 $!

如果删除untrap前缀,Ctrl-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]: $!";

相关内容