SIGINT는 백그라운드 하위 프로세스로 전파되지 않습니다.

SIGINT는 백그라운드 하위 프로세스로 전파되지 않습니다.

프로세스를 정상적으로 종료하려면 보내야 하는데 SIGINT그럴 수 없습니다.

실행이 일어나는 환경이 "알 수 없음"(travis.com의 bash 스크립트)이기 때문에 예시입니다.

나는 이와 같은 프로세스를 시작하여 동일한 동작을 얻을 수 있었습니다.(command &) &

vagrant@host:~$ (sleep 40 &) &
[1] 8473
vagrant@host:~$ ps -o pid,pgid,args
  PID  PGID COMMAND                     
 2787  2787 -bash                       
 8474  8473 sleep 40                    
 8490  8490 ps -o pid,pgid,args  
[1]+  Done                    ( sleep 40 & )
vagrant@host:~$ kill -INT 8474  ##### here I send SIGINT to the process
vagrant@host:~$ kill -INT -8473 ##### here I send SIGINT to the process group
vagrant@host:~$ ps -o pid,pgid,args
  PID  PGID COMMAND                     
 2787  2787 -bash                       
 8474  8473 sleep 40                    
 8559  8559 ps -o pid,pgid,args  

신호와 그룹에 대해 검색하고 많이 읽었지만 여기서 무슨 일이 일어나고 있는지 이해할 수 없습니다. 어느 시점에서 신호가 무시되었습니까? 뭐가 문제 야? SIGINTsleep프로세스 로 어떻게 보낼 수 있나요 ?

편집하다: SIGTERM사용하면 프로세스가 종료됩니다. (어쩌면 부모-자식 쉘이 종료되는 걸까요?)

답변1

비대화형 작업이 SIGINT에 응답하려면 SIGINT에 대한 핸들러를 생성해야 합니다.

$ ( (trap "echo Got SigInt" SIGINT; sleep 60) & ) &
[1] 13619
$ 
[1]+  Done                    ( ( trap "echo Got SigInt" SIGINT; sleep 60 ) & )
$ ps -o pid,pgid,args
  PID  PGID COMMAND
11972 11972 bash
13620 13619 bash
13621 13619 sleep 60
13622 13622 ps -o pid,pgid,args
$ kill -INT 13620
$ kill -INT 13621
$ Got SigInt

수면 프로세스에 SIGINT 보내기

Stéphane Chazelas가 의견에서 제안한 것처럼 SIGINT의 기본 동작을 반환하는 것이 목표라면 다음 trap - SIGINT과 같이 사용할 수 있습니다.

$ ( (trap - SIGINT; sleep 60) & ) &
[1] 16690
$ ps -o pid,pgid,args
  PID  PGID COMMAND
11972 11972 bash
16691 16690 bash
16692 16690 sleep 60
16693 16693 ps -o pid,pgid,args
[1]+  Done                    ( ( trap - SIGINT; sleep 60 ) & )
$ kill -INT 16692
$ ps -o pid,pgid,args
  PID  PGID COMMAND
11972 11972 bash
16698 16698 ps -o pid,pgid,args

관련 정보