env
是否有像、nice
、等命令运行nohup
程序可以使用修改后的信号运行程序?就我而言,我需要将一些东西重置SIGINT
为SIG_DFL
.
为什么我需要这个?因为后台进程的非交互式bash
设置,您无法使用内置的 shell 重置它:SIG_IGN
SIGINT
trap
https://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]: $!";