2012-11-09 6 views
4

프레임 워크를 사용하는 파이썬 응용 프로그램이 있습니다.파이썬 트위스트 및 SIGKILL

필자는 twistd에서 생성 된 pidfile에 저장된 값을 사용합니다. 런처 스크립트는 존재 여부를 검사하고 pidfile이 이미 존재하면 데몬 프로세스를 생성하지 않습니다.

그러나 twistd는 SIGKILL 신호를 받으면 .pid 파일을 제거하지 않습니다. 런처 스크립트는 데몬이 이미 실행 중임을 인식합니다.

나는 SIGTERM 신호를 사용하는 것 데몬을 막을 수있는 적절한 방법을 실현하지만, 문제는 데몬을 시작 사용자가 로그 아웃 할 때, 데몬이 SIGTERM 신호를 얻을 수 결코, 그래서 분명히 그것은 SIGKILL으로 죽였다. 즉, 사용자가 로그 아웃하면 pidfile이 계속 존재하므로 데몬을 다시 시작할 수 없습니다.

그런 상황에서 파일을 사라지게 할 수있는 방법이 있습니까?

답변

4
signal(2) 사람 페이지에서

:

신호 SIGKILLSIGSTOP을 잡은되거나 무시 될 수 없다.

따라서 프로세스가 해당 신호에 대한 응답으로 정리 코드를 실행할 수있는 방법이 없습니다. 일반적으로 SIGKILL을 사용하여 SIGTERM (잡힐 수 있음)에 대한 응답으로 종료되지 않는 프로세스 만 종료합니다.

+0

답변 해 주셔서 감사합니다. 매우 논리적 인 것 같습니다. 그러나 그것은 왜 사용자가 로그 아웃했을 때 SIGTERM이 그 꼬인 데몬으로 보내지지 않고 대신 SIGKILL이 사용되는지 궁금합니다. – rafalcieslak

+2

사용자가 무엇을 로그 아웃합니까? –

+0

@ Jean-PaulCalderone : 제 트위스트 데몬은 정확히 dbus 서비스로 시작됩니다. dbus는 서비스가 종료 될 때 모든 서비스를 종료하지만, twisted 데몬은 SIGKILL을 대신 읽습니다. – rafalcieslak

0

twisted를 다시 시작하기 전에 런처를 변경하거나 (다른 런처에서 마무리 할 수 ​​있음) pid 파일을 제거 할 수 있습니다.

+0

이것은 현재 내가하는 일입니다. 파일이 있지만 데몬이 응답하지 않으면 실행 프로그램이 주어진 pid를 죽이려고 시도한 다음 파일을 제거합니다. 그러나 두 경우 모두 pidfile이 존재하는 것처럼 데몬이 실행 중인지 (예 : 정지 상태인지 여부) 또는 죽은 경우를 구별 할 수있는 방법이 없습니다. 그리고 요점은 그것이 (아마도 이전 세션에서도) 살해 당했다면 아마도 완전히 다른 새로운 프로세스가 될 수 있기 때문에 그 pid를 죽일 수는 없다는 것입니다. – rafalcieslak