2017-05-10 6 views
0

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를 통해 시작한 데몬간에 차이가 없음을 알 수 있습니다.

편집 : 모든 의견을 주셔서 감사합니다. 그들 중 누구도 정확히 동일한 코드가 일부 시스템에서는 작동하지만 다른 시스템에서는 작동하지 않는다고 생각하는 것 같습니다. 내가 생각할 수있는 유일한 것은 데몬이 다른 환경에서 시작된다는 것입니다. 질문 : 환경에서 신호가 무시 될 수있는 프로세스가 시작되었다는 것이 있습니까?

+0

두 경우 사이의 블록 마스크 차이점을 추적했습니다. 질문 [여기] (http://stackoverflow.com/questions/43931229/setting-up-signal-masks-in-a-linux-c-daemon) – Marius

+0

에 대한 새 스레드를 만들었습니다.이 문제는 이제 해결되었습니다. . 위의 주석의 링크를 참조하십시오. – Marius

답변

0

아마도 kill <pid>이 작동하지 않을 수도 있습니다. PHP에서는 특정 문제가 아닙니다. kill은 프로세스에서 쉽게 무시할 수 있습니다. 이제는 C 데몬이지만 데몬이하는 일에 대해서는 언급하지 않았습니다. 그래서 나는 단지 여러분의 데몬이 I/O를 기다리고 있다고 가정하고, 타임 아웃으로 적절하게 설정되지 않았고, 당신은 그것을 죽인다. 그렇다면 그 과정은 아무리해도 죽지 않을 것입니다.

가능한 해결책은 https://askubuntu.com/questions/59811/kill-pid-not-really-killing-the-process-why을 참조하십시오.

+0

당신은''을 필요로하지 않는'pkill process'도 시도 할 수 있습니다. 대신 프로세스의 이름을 사용합니다 –

+0

첫 번째 문장의 문장은 정확하지만 데몬이 시작될 때 kill이 작동하지 않는 이유는 무엇입니까? 명령 줄이지만 다른 방법으로 시작한 경우는 아닙니다. 제공된 스레드에서 단서를 찾을 수 없습니다. – Marius

+0

@ 마리우스 여기서 가정을하고 있습니다 만, 죽이려고하는 프로세스가 부모 프로세스 인 경우에는'-P' 인수를 사용할 수 있습니다. 이와 같이 pkill -P