프로세스가 S 상태(중단 가능 절전 모드)에 있을 때 종료 신호를 캡처합니다.

프로세스가 S 상태(중단 가능 절전 모드)에 있을 때 종료 신호를 캡처합니다.

프로세스 그룹은 다음과 같습니다: ( ps -ejH)

 xxxx  xxxx  xxxx ?        00:00:00   sshd
 yyyy  yyyy  yyyy ?        00:00:00     sshd
 8713  8713  8713 pts/0    00:00:00       bash

 1234  1234  1234 ?        00:00:00   Process 1
 5678  1234  1234 ?        00:00:00     openvt
 3789  3789  3789 tty4     00:00:00       Python process

프로세스 상태는 다음과 같습니다.

Process1 : Ss [중단 가능한 절전 및 세션 리더]

openvt: S [수면을 중단할 수 있음]

python 프로세스: Ss+ [절전 및 세션 리더와 전경 실행 프로세스를 중단할 수 있음]

저는 /dev/pts0 [8713] bash 터미널에서 작업하고 있습니다.

내가 보내면 kill 1234process1만 종료되지만 하위 프로세스는 종료되지 않습니다. 그래서 저는 종료하기 전에 하위 프로세스를 종료하는 함수를 Process1에 작성했습니다.

트랩을 사용하여 이 함수를 호출하면 다음과 같습니다.

trap function_name SIGTERM

kill 1234또는 보내면 트랩 함수는 내가 작성한 함수를 호출하는 신호를 포착하지 못합니다 kill -15 1234.kill -s TERM 1234

다시 한번, process1에서 트랩 명령을 제거하고 호출하면 kill 1234procces1이 종료됩니다.

둘 다 백그라운드에서 실행 중일 때 실행 제어는 process1이 아닌 openvt에 있고 process1은 이 kill 명령을 받지 않기 때문이라고 생각합니다.

이제 process1이 kill 명령을 받도록 하는 방법은 무엇입니까?

추신: 여기서 openvt는 Python 프로세스를 실행하기 위해 새로운 가상 터미널을 엽니다. 이를 수행하는 데 사용되는 명령은 다음과 같습니다 openvt -f -s -c 4 -w python_process. -w 명령이 완료될 때까지 기다립니다.

참고: 에서리눅스 매거진프로세스가 중단 가능한 절전 상태(예: 터미널 I/O 대기)에 있는 동안 신호가 수신되면 커널은 프로세스를 깨워 신호를 처리합니다. 프로세스가 중단 없이 잠자고 있는 동안(예: 디스크 I/O를 기다리는 동안) 신호를 받으면 커널은 이벤트가 완료될 때까지 신호를 연기합니다.

process1에 보낸 Kill 신호는 인터럽트 가능한 절전 상태(S)에 있었지만 커널이 신호를 지연시켰습니다.. 왜일까요?

하나 있다우편 엽서이를 기반으로 했지만 해결되지 않았습니다.

업데이트 1: pkill -TERM -p pid 명령을 사용하여 상위 프로세스의 모든 하위 프로세스를 종료하고 kill pid를 호출하면 트랩 명령에 의해 신호가 포착됩니다.

관련 정보