포착되지 않은 SIGINT를 수신한 후 프로세스가 계속됩니다(터미널에서 Ctrl-C).

포착되지 않은 SIGINT를 수신한 후 프로세스가 계속됩니다(터미널에서 Ctrl-C).

Ctrl-CCentos7의 터미널에서 실행 중인 일부 프로세스를 중단 하려고 합니다 . 일부는 중단되지만 일부는 중단되지 않습니다.

문제의 프로세스 중 하나(Process-A)는 부가 기능이 없는 GNU makefile입니다. 일반적인 단일 파일 make 시스템입니다. 다른 하나(프로세스 B)는 TCP 소켓에서 수신 대기하는 C 애플리케이션입니다.

다음은 이러한 문제가 있는 프로세스 중 일부를 실행(및 종료)하는 동안 관찰한 내용입니다.

  • 프로세스 A는 따르지 않습니다 Ctrl-C. strace -f로 시작하고 Ctrl-C누르면 strace가 하위 프로세스에서 분리되고추적 종료그러나 프로세스 A는 추적 로그 없이 계속 실행됩니다(이상합니다).
  • Ctrl-CProcess-B는 로 시작할 때 strace -fSIGINT를 포착 하지 못하고 예상대로 종료됩니다.
  • Process-B는 Ctrl-C백그라운드로 억제될 때에도 이를 삭제하지 않고 SIGINT()를 외부로 보내고 kill -s SIGINT PIDSIGTERM이 이를 종료합니다.

추가 세부 사항:

  1. 테스트 프로그램을 사용하여 내 터미널이 SIGINT를 프로세스에 보내고 있는지 확인했습니다(테스트 프로그램이 종료되었습니다).
  2. 두 프로세스 모두에서 수동으로 신호를 캡처하지 않았습니다.
  3. 동일한 동작을 관찰하려면 여러 터미널 응용 프로그램을 사용해 보십시오.

이러한 신호가 어떻게 계단식으로 전달되는지, 그리고 여기서 무엇을 놓치고 있는지에 대한 명확한 이해가 필요합니다. 이런 종류의 문제를 디버깅하는 방법은 무엇입니까?

업데이트 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설정이나 사용자 정의 작업 또는 작업 모니터링 구성이 있습니까?

관련 정보