here과 같이 Grand Central Dispatch로 관리되는 SIGTERM 처리기에서 잠자기를 시도 할 때 launchd 관리 데몬에서 이상한 상황이 발생합니다.
모든 것이 잘 작동하고 SIGTERM 신호 처리기에서 SIGTERM 처리기에서 절전 모드를 종료 할 때 SIGKILL을 수신합니다. 그러나 내가 잠들 자마자 - usleep(1);
과 같이 극단적으로 짧은 시간 일지라도 - 나는 SIGTERM 핸들러를 전혀 얻지 못한다. 대신에 데몬은 launchd에 의해 즉시 SIGKILLED된다.launchd : GCD 관리되는 신호 처리기에서 잠시
Btw 내 plist 파일에 vproc_transaction_begin(3)
/vproc_transaction_end(3)
코드로 EnableTransactions를 사용하고 있습니다 (here).
"클라이언트 processess"에 대한 정보를 폴링하여 데몬을 종료할지 여부를 알기 때문에 SIGTERM 처리기에서 절전 모드로 전환하지 않아도됩니다.
마치 잠을 자면 출력이 보이지 않기 때문에 시그널 핸들러에서 잠을 자 자마자 직접 SIGKILL (및 예상되는 SIGTERM이 아닌)을 수신하는 일부 컴파일러 플래그가있는 것처럼 보입니다. 내 SIGTERM 핸들러의 그러나 디버그가 절전 모드로 인쇄되는 것을 볼 수는 있지만, 그렇지는 않습니다. 여기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.example.myTestD</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/myTestD</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ExitTimeOut</key>
<integer>0</integer>
<key>EnableTransactions</key>
<true/>
</dict>
</plist>
그리고 내 SIGTERM 핸들러는 다음과 같습니다
여기 내 PLIST 파일입니다. usleep (1)을 추가하자 마자 출력이 전혀 표시되지 않습니다. 선.
static void mySignalHandler(int sigraised)
{
int fd = open("/tmp/myTestD.log", O_WRONLY | O_CREAT | O_APPEND, 0777);
if (fd <= 0) return;
dprintf(fd, "%s(): signal received = %d, sleeping some time ...\n", __func__, sigraised);
usleep(1);
dprintf(fd, "%s(): ... done\n", __func__);
dprintf(fd, "%s(): EXITING\n", __func__);
close(fd);
// transactionHandle is global variable assigned in daemon main
if (transactionHandle) vproc_transaction_end(NULL, transactionHandle);
exit(0);
}
모든 힌트/답변을 보내 주셔서 감사합니다.
크리스
감사 :
어쨌든, 도움이 경우에, 여기에 내가이 시나리오를 테스트하는 데 사용되는 코드는 내 이전을위한 –
죄송합니다 불필요한 코멘트가 있지만 더 많은 라인을 작성하는 동안 나는 회의에 끌려 갔다 ... 아무렇게나 : * 나는 재진입 libc 함수의 작은 세트로 제한된다는 것을 알고 있으므로 표준 POSIX 신호 처리를 사용하지 않는다. * ExitTimeOut을 0으로 설정 한 경우 적어도 launchd는 system.log ("프로세스는 무한 종료 시간이 있습니다 ...")에서>라고 말했기 때문에 무한 exitTimeOut을 인식하는 것으로 보였습니다. 그러나 즉시 제안을 확인합니다. 나는 일하러 돌아왔다. –
예. 분명히 ExitTimeOut이 0으로 설정되면 무한히 의미하지만 * 실제로는 적어도 launchctl unload (프로세스를 죽이기 위해 launchd를 트리거하는 방법)에 의해 exit가 트리거 될 때 동작이 다르게 보입니다. 출처는 다음과 같습니다. http://www.opensource.apple.com/source/launchd/launchd-442.26.2/src/core.c 거기에 정확히 ** 흡연 총 **이 없지만 거기에있는 것처럼 보입니다. 'exit_timeout'의 제로가 명확하게 지켜지지 않는 경우도 있으므로 생각할 수 없습니다. 그것이 나 였다면, 나는 단지'ExitTimeOut = 0'을 사용하지 않고 삶을 살아갈 것입니다. – ipmcc