Ctrl-C
Centos7의 터미널에서 실행 중인 일부 프로세스를 중단 하려고 합니다 . 일부는 중단되지만 일부는 중단되지 않습니다.
문제의 프로세스 중 하나(Process-A)는 부가 기능이 없는 GNU makefile입니다. 일반적인 단일 파일 make 시스템입니다. 다른 하나(프로세스 B)는 TCP 소켓에서 수신 대기하는 C 애플리케이션입니다.
다음은 이러한 문제가 있는 프로세스 중 일부를 실행(및 종료)하는 동안 관찰한 내용입니다.
- 프로세스 A는 따르지 않습니다
Ctrl-C
. strace -f로 시작하고Ctrl-C
누르면 strace가 하위 프로세스에서 분리되고추적 종료그러나 프로세스 A는 추적 로그 없이 계속 실행됩니다(이상합니다). Ctrl-C
Process-B는 로 시작할 때strace -f
SIGINT를 포착 하지 못하고 예상대로 종료됩니다.- Process-B는
Ctrl-C
백그라운드로 억제될 때에도 이를 삭제하지 않고 SIGINT()를 외부로 보내고kill -s SIGINT PID
SIGTERM이 이를 종료합니다.
추가 세부 사항:
- 테스트 프로그램을 사용하여 내 터미널이 SIGINT를 프로세스에 보내고 있는지 확인했습니다(테스트 프로그램이 종료되었습니다).
- 두 프로세스 모두에서 수동으로 신호를 캡처하지 않았습니다.
- 동일한 동작을 관찰하려면 여러 터미널 응용 프로그램을 사용해 보십시오.
이러한 신호가 어떻게 계단식으로 전달되는지, 그리고 여기서 무엇을 놓치고 있는지에 대한 명확한 이해가 필요합니다. 이런 종류의 문제를 디버깅하는 방법은 무엇입니까?
업데이트 1:
grep 'search_string'
입력을 기다리기 위해 grep을 실행합니다 STDIN
. 이제 닫을 수 없습니다 Ctrl-C
. 이것이 환경에 특정한 문제인지 궁금해지기 시작했습니다.
업데이트 2:
일부 작업 후에 아래 표시된 소스 RVM 스크립트가 문제를 일으키는 것으로 확인되었습니다.
if [ -f ~/.rvm/scripts/rvm ]; then
source ~/.rvm/scripts/rvm
export PATH="$PATH:$HOME/.rvm/bin"
fi
답변1
Process-A는 Ctrl-C로 종료되지 않지만 strace는 종료합니다(이상합니다).
strace
이는 신호 처리가 아니라 Process-A 처리이므로 전혀 놀라운 일이 아닙니다 . 생성된 신호는 control+c포그라운드 프로세스 그룹의 모든 프로세스로 전송됩니다.단말기다른 모드에서는) 아래 테스트 사례에는 strace
및 가 포함됩니다 perl
. strace
종료하지만 신호는 무시되고 프로세스는 종료될 때까지 계속 실행됩니다.
% strace perl -E '$SIG{INT}="IGNORE";while(1){say $$;sleep 1}'
...
% 9520
9520
9520
kill9520
9520
%
grep이 STDIN에서 입력을 기다리도록 grep 'search_string'을 실행합니다. 이제 Ctrl-C를 사용하여 닫을 수 없습니다.
이는 쉘 구성에 문제가 있음을 나타냅니다. grep
상위 프로세스(이 경우에는 쉘)에서 상속된 신호 처리기가 있을 수 있습니다. 나는blocksig
이 사례를 설명하는 스크립트:
% grep asdf
^C
% blocksig grep asdf
^C^C^C^C^C^]^\zsh: quit blocksig grep asdf
%
그러나 귀하의 경우 이는 blocksig
상위 프로세스가 아닌 쉘입니다. 일반적인 파일을 읽지 않고 다른 쉘로 전환하거나 쉘을 시작하면 rc
어떻게 됩니까 ? 셸 구성에 trap
설정이나 사용자 정의 작업 또는 작업 모니터링 구성이 있습니까?