rhel VM을 시작한 후 로그 파일(tail -f xyz.log)을 따르지만 control-c를 사용하여 종료할 수 없다는 것을 깨달았습니다. 나는 control-z를 시도했지만 백그라운드 작업을 종료했기 때문에 프로세스를 수동으로 종료해야 했습니다(tail -f xyz.log).
우리 가게의 누군가가 /etc/profile의 트랩 기능을 주석 처리하라고 해서 그렇게 했습니다.
#trap "" 1 2 3 15
그런 다음 로그아웃했다가 다시 쉘 환경에 로그인하면 control-c가 작동하기 시작합니다!
나는 단지 무슨 일이 일어나고 있는지 이해하고 싶습니다. <맨트랩>을 했는데 아쉽게도 그 안에 담긴 내용을 잘 활용하지 못했어요. 시간을 내어 이 기사를 읽어주셔서 감사합니다.
답변1
주어진 trap
명령은 쉘에게 다음 신호를 가로채도록 지시합니다.
1 SIGHUP
2 SIGINT
삼 SIGQUIT
15SIGTERM
""는 이러한 신호 중 하나가 수신될 때 실행되는 명령입니다. 즉, 아무것도 하지 말고 신호를 완전히 무시하십시오.
stty -a
예를 들어 이 예의 두 번째 출력 줄을 사용하여 신호에 바인딩된 문자를 확인할 수 있습니다 stty
(형식은 사용 중인 시스템에 따라 다름).
$ stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
일부 문자와 신호 간의 대응은 다음과 같습니다.11.1.9 특수 문자,예를 들어,
intr
보내다SIGINT
quit
보내다SIGQUIT
그래서 내가 ^C
보낼게SIGINT
(귀하의 구성은 다를 수 있습니다).
이것을 주석 처리하면 trap
쉘은 기본 동작으로 되돌아가서 이러한 특수 문자가 입력할 때 신호를 보냅니다(예: ^\
send).SIGQUIT
그리고 ^C
보내다SIGINT
.
추가 자료:
- 트랩 - 트랩 신호(POSIX 쉘 내장), 주석
만약에행동null( "" )인 경우, 쉘은 지정된 각 조건이 발생하면 무시합니다.
- Kill - 프로세스를 종료하거나 신호를 보냅니다.(표준 신호 이름과 해당 값을 표시하는 POSIX도 있습니다.)
- stty - 터미널 옵션 설정
- SIGINT는 다른 종료 신호와 어떤 관련이 있습니까?
답변2
터미널에서 Ctrl+를 누르면 CSIGINT가 전송됩니다.신호터미널에서 실행중인 프로세스에. (더 정확하게는 포그라운드 프로세스 그룹의 모든 프로세스에 전송됩니다. 예를 들어 을 실행 중인 경우 foo | tail -f
신호는 및 에 전송됩니다 foo
. tail
)
전통적인 의미지능을 신호하다(인터럽트 신호)는 "현재 작업을 중단하고 대화형 프롬프트로 돌아갑니다"입니다. 대화형 프롬프트(예: tail)가 없는 프로그램은 종료되고 쉘이 대신하게 됩니다.
이것trap
주문하다신호를 수신할 때 쉘의 동작을 정의합니다. 예를 들어, trap 'echo killed' INT
쉘이 SIGINT 신호를 수신 killed
하면 인쇄합니다 . trap 'echo killed' 2
Linux PC에서도 마찬가지입니다. 2는 INT라는 신호의 번호이기 때문입니다. 다른 프로그램이 포그라운드에 있는 경우가 아니라 쉘이 신호를 수신할 때만 실행됩니다.
trap "" INT
특별한 경우이다. 신호를 수신할 때 쉘에 아무것도 하지 말라고 지시할 뿐만 아니라 쉘에도 지시합니다.소홀히 하다신호. 프로세스가 신호에 대한 핸들러를 등록하면 실행되는 프로그램에 영향을 주지 않습니다. 핸들러는 프로세스 내의 코드이며 다른 프로그램에서 호출할 수 없습니다. 그러나 신호를 무시하는 것은 한 프로그램이 다른 프로그램을 실행할 때 유지되는 다른 설정입니다. 따라서 나중에 trap "" INT
실행하면 tail
신호가 여전히 무시되고 Ctrl+를 눌러도 C아무런 효과가 없습니다.
쉘에서는 신호를 효과적으로 무시하지만 시작하는 프로그램에서는 신호를 무시하지 않으려면 trap " " INT
또는 trap : INT
( :
쉘의 no-op 명령)과 같은 널이 아닌 트랩을 설정하십시오. 또는 trap - INT
실행하기 전에 실행하여 tail
신호 처리를 기본 무시되지 않은 상태로 재설정합니다.
답변3
trap
이는 쉘에 내장되어 있으며 일반 형식은 입니다 trap cmd list_of_signals
. cmd
귀하의 경우에는 비어 있습니다. 즉, 신호가 무시됩니다. 1
은 hangup
신호이고, 은 또는 3
입니다 . 자세한 설명은 장을 참조하세요.intr
Ctrl-C
man bash
Shell Builtin Commands