Linux에서 간단한 C 데몬을 만들었습니다. 데몬은 SIGTERM 신호를 잡아 내고 정리를하고 종료합니다. 명령 줄에서 실행하면 예상대로 작동합니다. kill 명령을 통해 SIGTERM을 데몬으로 보내면 제대로 처리됩니다.PHP로 특정 상황에서 C 데몬을 중지 할 수 없습니다
그러나 PHP 응용 프로그램에서 데몬을 시작하고 중지 할 수 있기를 원합니다. PHP에서 exec()를 사용하여이 작업을 수행합니다.
exec("$daemon_name");
를 시작하려면이 방법은 항상 작동 데몬을 시작
exec("kill $daemon_pid");
을 중지하지만, 정지하지 않습니다. 사실, 이런 식으로 시작하면 명령 줄에서 kill을 실행해도 작동하지 않습니다. 이제 "kill -9"만 작동하며 필요한 정리 작업을 수행하지 않습니다. 내가 알 수있는 한, 그 과정은 단순히 신호를 얻지 못하고있다.
다음은 실제로 나를 얻는 것입니다. SLES 12 나 OpenSuSE 42.2에서 똑같은 설정을 적용하면 작동하지 않지만 OpenSuSE 42.1에서는 작동합니다 (PHP를 통해 시작하고 중지 할 수 있음).
권한 문제가 아니며이를 확인했습니다.
프로세스가 SIGTERM 신호를 수신하지 못하게하는 원인이 무엇인지 아이디어가 없습니다. "ps aux"및 "ps -ef"의 출력을 보면 명령 행에서 시작한 데몬과 PHP를 통해 시작한 데몬간에 차이가 없음을 알 수 있습니다.
편집 : 모든 의견을 주셔서 감사합니다. 그들 중 누구도 정확히 동일한 코드가 일부 시스템에서는 작동하지만 다른 시스템에서는 작동하지 않는다고 생각하는 것 같습니다. 내가 생각할 수있는 유일한 것은 데몬이 다른 환경에서 시작된다는 것입니다. 질문 : 환경에서 신호가 무시 될 수있는 프로세스가 시작되었다는 것이 있습니까?
두 경우 사이의 블록 마스크 차이점을 추적했습니다. 질문 [여기] (http://stackoverflow.com/questions/43931229/setting-up-signal-masks-in-a-linux-c-daemon) – Marius
에 대한 새 스레드를 만들었습니다.이 문제는 이제 해결되었습니다. . 위의 주석의 링크를 참조하십시오. – Marius