Bash

是否有命令行工具來管理 unix 信號?

  • July 3, 2015

是否有像env, nice,nohup等這樣的命令執行程序可以執行帶有修改信號的程序?就我而言,我需要一些東西來重置SIGINTSIG_DFL.

為什麼我需要這個?因為後台程序的非互動式bash設置SIG_IGNSIGINT您無法使用內置的 shell 重置它traphttps ://bugs.debian.org/cgi-bin/bugreport.cgi?bug=573780

更新:在 bash 4.3 後台子shell 不忽略 SIGINT,其他後台程序仍然這樣做

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

H。修復了導致 SIGINT 和 SIGQUIT 無法在非同步子 shell 命令中擷取的錯誤。

沒有。很容易用 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]: $!";

引用自:https://unix.stackexchange.com/questions/213609