![Unix 신호를 관리하기 위한 명령줄 도구가 있습니까?](https://linux55.com/image/68225/Unix%20%EC%8B%A0%ED%98%B8%EB%A5%BC%20%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%9C%20%EB%AA%85%EB%A0%B9%EC%A4%84%20%EB%8F%84%EA%B5%AC%EA%B0%80%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
env
수정된 신호 실행 프로그램을 사용할 수 있는 nice
, 등과 같은 명령 실행 프로그램 이 있습니까 ? nohup
제 경우에는 무언가 SIGINT
를 SIG_DFL
.
왜 이것이 필요합니까? 백그라운드 프로세스의 비대화형 설정으로 인해 bash
내장 셸을 사용하여 재설정할 수 없습니다.SIG_IGN
SIGINT
trap
https://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 $!
접두사가 제거되면 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]: $!";