2011-11-23 3 views
1

원격 데이터베이스에 시작/종료 시간을 기록하는 LaunchDaemon으로 실행중인 작은 python 스크립트를 작성했습니다. 스크립트가 시작되면 시작 시간을 기록한 다음 일시 중지하고 종료 시간을 기록하기 위해 SIGTERM을 잡기를 기다립니다. 거의 동일한 워크 플로우가 로그인/로그 아웃 시간을위한 LaunchAgent로 사용됩니다.LaunchDaemon 처리 시스템 종료 - SIGTERM이 아닙니까?

그러나 애플의 갑작스런 종료 메커니즘이 렌치를 물건에 던지고있는 것처럼 보입니다. 시스템이 종료되거나 다시 시작될 때 launchd은 처리 할 수없는 launchdaem 및 launchagents에 SIGKILL 신호 만 보냅니다. 나는 기술적 인 문제일지도 모르지만 그것은 본질적으로 내가 경험하고있는 것입니다.

launchctl로 데몬을 수동으로로드/언로드하면 SIGTERM 처리기가 트리거됩니다. 그러나 실제 시스템 종료가 발생하면 동일한 코드가 트리거되지 않습니다.

누군가가 SIGKILL을 예방하는 방법에 대한 권장 사항이 있습니까?

답변

3

this을 올바르게 읽는다면 launchd plist에 <key>EnableTransactions</key><true/>이 없으면 데몬에서 갑자기 종료하지 않아야합니다. 하지만 문서가 조금 막연합니다, 그래서 나는 또한 <key>EnableTransactions</key><false/>을 plist에 추가하려고합니다. 그렇지 않으면 프로그램에서 vproc_transaction_begin을 호출 할 수 없습니다. (파이썬에서 호출 할 수 있다고 가정하지만 역학을 모르겠습니다.).

+0

와우 ... ' EnableTransactions'을 추가하면 트릭을 만들었습니다. 이전에 false를 기본 값으로 가정하면서 생략했습니다. 이제 프로세스는 신호 9 (SIGKILL) 대신 신호 15 (SIGTERM)가 전송됩니다. – joraff

+0

라이온에서 운영하고 있습니까? 기본값이 변경되었을 수 있습니다 ... –

+0

예. 나는 그것에 대해서도 생각했지만, 10.6 및 10.7 launchd.plist 맨 페이지에서 EnableTransactions와 관련된 차이점을 발견하지 못했습니다. 불행히도 이제이 모든 작업을 마친 후, 신호 처리기가 작동하지 않을 때 네트워크가 이미 중지되었음을 알게되었습니다. – joraff