2010-07-10 5 views
4

SIGTERM을 프로세스 그룹에 전송하여 프로세스 그룹을 종료하려고합니다. 이것은 kill 명령을 통해 수행하지만, 내가 찾은 매뉴얼이 어떻게 작동하는지 정확히에 대한 몇 가지 세부 사항 제공 할 수 있습니다프로세스 goup의 프로세스가 신호를 수신하는 순서에 대해 걱정해야합니까?

int kill(pid_t pid, int sig); 
    ... 
    If pid is less than -1, then sig is sent to every process in 
    the process group whose ID is -pid. 

그러나, 어떤 순서로 신호가 그룹을 형성하는 프로세스로 전송됩니다? 다음 상황을 상상해보십시오 : 파이프가 그룹의 마스터 프로세스와 종속 프로세스 사이에 설정됩니다. kill(-pid) 처리 중에 슬레이브가 종료 된 경우에도 마스터는 여전히 마스터가 아닌 경우 마스터가이를 내부 오류로보고 할 수 있습니다 (자식이 사망했다는 알림을 받으면). 그러나, 나는 모든 프로세스가 그러한 종료가 그들의 프로세스 그룹 외부의 어떤 것으로 인해 야기되었다는 것을 이해하기를 원한다.

어떻게 이런 혼란을 피할 수 있습니까? 내가 단순한 것보다 더해야 할 일 kill(-pid,SIGTERM)? 또는 OS에 대한 기본 속성에 의해 해결되었는데, 그 중 일부는 내가 알지 못하는 것입니까?

그룹의 프로세스 코드를 수정할 수 없습니다.

답변

5

세 단계 과정으로 수행보십시오

kill(-pid, SIGSTOP); 
kill(-pid, SIGTERM); 
kill(-pid, SIGCONT); 

제 SIGSTOP이 정지 상태에있는 모든 프로세스를 넣어야. 그들은이 신호를 포착 할 수 없으므로 전체 프로세스 그룹을 중지해야합니다.

SIGTERM은 프로세스 대기열에 있지만 프로세스가 중지 되었기 때문에 전달 될 것이라고 생각하지 않습니다. (메모리에서 발생하고 현재 참조를 찾을 수는 없지만 사실이라고 생각합니다) .

SIGCONT는 SIGTERM이 전달되도록 프로세스를 다시 시작합니다. 슬레이브가 SIGCONT를 먼저 얻는다면 마스터는 여전히 멈추어 서 슬레이브가 사라지는 것을 알아 채지 못할 것입니다. 마스터가 SIGCONT를 가져 오면 SIGTERM이 종료되고 종료됩니다.

이것이 실제로 작동하는지는 모르겠지만 모든 신호가 실제로 전달되었을 때 (마스터 프로세스에 SIGCHLD 포함) 구현에 따라 달라질 수 있지만 시도해 볼 가치가 있습니다.

+1

그래,이 솔루션은 내가 현재 구현 한 것입니다. 나는 시스템에서'SIGTERM' 핸들러가 실제로'SIGCONT' 때문에 프로세스가 깨어날 때까지 호출되지 않았 음을 확인했다. 나의 실험은 또한 모든 적절한'SIGCHLD' 신호가 제어 과정에 전달된다는 것을 보여줍니다 : 우리가 신호를 보내는 자식의 중지, 다시 시작 및 종료시. –

+1

'ps' 출력을 체크하거나'/ proc//stat'을 체크하여 프로세스 상태를 확인합니다. 매뉴얼 상태대로 'ps'출력의 'T'에 의해 멈춤 상태를 나타냅니다. – mvds

1

필자는 특정 신호 전달 순서에 의존 할 수 없다는 점을 이해합니다.

TERM 신호를 마스터 프로세스에만 보내고 마스터가 자식을 죽이면이 문제를 피할 수 있습니다.

+0

나는 마스터에게 아무 것도 할 수 없다. 소스를 사용할 수 없다고 가정합니다. 사실, *이 질문이 나타나는 이유입니다. :-) –

+0

@Pavel Shved - 정말 프로그래밍 문제입니까? 내가 아는 한 마리우스는 옳다.하지만 ServerFault에 대해 묻는 것이 가치가 있을지 모른다. Sysadmin 유형은 이러한 종류의 질문을 좋아합니다. :) – Duck

+0

@Duck, 확실히 프로그래밍 문제이지만 Server Fault 사용자는 이에 대해 더 많이 알고 포인터에 감사드립니다. –

0

테스트되지 않음 : 공유 메모리를 사용하고 I/O 오류가 실제 오류로 처리되기 전에 검사 할 수있는 일종의 "we 're dying"세마포를 넣습니다. mmap()을 MAP_ANONYMOUS | MAP_SHARED와 함께 사용하고 프로세스가 fork() 처리되지 않는지 확인하십시오.

아, 그리고 volatile 키워드를 사용하십시오. 그렇지 않으면 세마포어가 최적화됩니다.

+0

다시 수정할 수 없습니다 모든 프로세스. 내가 할 수 있다면 인생은 훨씬 쉬워 질 것입니다 ... 이것을 반영하기 위해 질문을 편집했습니다. –

1

다양한 다양한 UNIX가 신호를 특정 순서로 전달한다고해도 스케줄러는 여전히 상위 코드보다 중요한 하위 프로세스 코드를 실행하기로 결정할 수 있습니다.

STOP/TERM/CONT 시퀀스도이 문제에 취약합니다.

좀 더 복잡한 것이 필요할 수도 있습니다.아마도 자식 프로세스가 SIGTERM을 잡아 내고 부모 프로세스가 종료되기 전에 루프를 종료 할 때까지 반복 할 수 있습니까? 이 작업을 수행하는 경우 시간 제한을 추가하십시오.

+0

나는 죽이는 프로세스의 코드를 변경할 수 없습니다. 죄송합니다. 질문을 수정했습니다. –

관련 문제