2013-11-25 2 views
4

나는 여러 프로세스와 통신하는 데몬을 연구 중이다. 데몬은 항상 프로세스를 모니터링 할 수는 없지만, 프로세스가 죽을 때 프로세스가 죽었는지 제대로 식별 할 수 있어야합니다.장기 실행 프로세스가 중단되었는지 확인하는 방법은 무엇입니까?

프로세스는 데몬과 통신하여 시작 부분에 정보를 제공 할 수 있지만 그 반대는 아닙니다. 따라서 데몬은 프로세스에 ID를 요청할 수 없습니다.

가장 간단한 형태는 PID 만 사용하는 것입니다. 그러나 궁극적으로 내 도구가 눈치 채지 않고도 다른 프로세스에 동일한 PID를 할당 할 수 있습니다.

더 나은 방법은 PID와 프로세스 시작 시간을 사용하는 것입니다. 동일한 PID를 갖는 새로운 프로세스는 별개의 시작 시간을 갖습니다. 하지만 POSIX 방식으로 프로세스 시작 시간을 얻는 방법을 찾지 못했습니다. ps을 사용하거나 /proc/<pid>/stat을 보면 충분히 휴대 할 수없는 것처럼 보입니다. POSIX 호환 보인다

더 복잡한 생각은 다음과 같습니다

  • 각 프로세스는 임시 파일을 만듭니다.
  • 잠금 장치 flock
  • 내 데몬에 "내 신원이이 파일과 연결되었습니다."라고 알립니다.
  • 언제든지 데몬이 임시 파일을 확인할 수 있습니다. 잠겨 있으면 프로세스가 살아 있습니다. 그것이 아니라면, 그 과정은 죽었습니다.

그러나 이것은 불필요하게 복잡해 보입니다.

더 좋거나 표준적인 방법이 있습니까?

편집 : 데몬은 다시 시작한 후에 다시 시작할 수 있어야하므로 각 프로세스마다 영구 연결을 유지할 수 없습니다.

답변

1

은 "하나의 좋은 방법"에서 포인트 어렵다하지만 어떻게 프로세스 시작을 얻을 수있는 방법을 찾을 수 없습니다 시간을 POSIX 방식으로 처리합니다. LC_ALL=C ps -eo etime= $PIDS

공정에서, 나는 아마 프로세스 테이블 및 경과 시간에 의존 오히려 라이브 프로세스 내 자신의 테이블을 만들 것입니다 :

standard "etime" format specifier보십시오. 그것은 근본적으로 파일 잠금 방식이지만, 모든 잠금 파일을 알려진 위치에 모아 PID (예 : /var/run/my-app/8819.lock)로 이름을 지정하는 것이 좋습니다.사실 이것은 심지어 파일 실행 자의 파일 잠금이 exec()에 걸쳐 상속 될 수 있기 때문에 장기 실행 프로세스에 추가 될 수 있습니다.

(물론 내가 신경 쓰는 장기 실행 프로세스가 공통 상위 프로세스를 갖고 있다면 프로세스가 실행되고 있고 실행되지 않는 신뢰할 수있는 권한이 될 수있는 공통 상위 프로세스를 쿼리해야합니다.)

1

표준 방식은 불필요하게 복잡합니다. POSIX 호환 환경에서의 삶 ...

1

파일 이외의 다른 방법이 존재하고 다양한 이점/절충점이 있습니다. "표준"IPC 메커니즘의 대부분은 소켓, 파이프, 메시지로 작동합니다. 대기열, 공유 메모리 ... 기본적으로 응용 프로그램이 시작한 데몬에 알릴 수있는 메커니즘을 선택합니다 (그리고 정상적으로 종료되면 정상적으로 종료 될 수 있습니다). 사이에주기적인 "나는 아직 여기있어"라는 메시지를 보낼 수 있고, 데몬이 메시지를받지 못하거나 데몬이 주기적으로 또는 무엇인가를 조사 할 수 있음을 알 수 있습니다 ... 원하는 것을 성취 할 수있는 방법이 많이 있습니다. 그러나 당신이 달성하기 위해 노력하고 정확한 아키텍처에 대한 자세한 내용을 모르고, 그것은 ...

+0

문제는 다시 시작한 후에 데몬을 다시 시작할 수 있어야한다는 것입니다. 이것은 소켓 연결이나 그와 비슷한 것을 잃음으로써 프로세스의 죽음을 감지 할 수 없다는 것을 의미합니다. 프로세스를보다 복잡하게 만들지 만, 프로세스가 데몬에 대한 연결을 주기적으로 갱신하도록 요구할 수 있습니다. 커널이 나를 위해 관리하는 것을 찾고있는 사람, 데몬이 이것을 확인하고있다 (프로세스 시작 시간과 같다). –

+0

@ PetrPudlák 예, 음, 모든 추가 요구 사항은 솔루션을 좀 더 복잡하게 만들 가능성이 큽니다 ... 이것은 매우 일반적인 현상입니다. – twalberg

관련 문제