Bash
是否有命令行工具來管理 unix 信號?
是否有像
env
,nice
,nohup
等這樣的命令執行程序可以執行帶有修改信號的程序?就我而言,我需要一些東西來重置SIGINT
為SIG_DFL
.為什麼我需要這個?因為後台程序的非互動式
bash
設置SIG_IGN
,SIGINT
您無法使用內置的 shell 重置它trap
:https ://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]: $!";