Плодятся зомби процессы defunct при вызове posix_kill
Проблема: есть некий трудоёмкий процесс в скрипте PHP, который вынесен из родительского потока.При завершении его, при помощи posix_kill, остается зомби процесс. Код вида:
1 2 3 4 5 6 7 8 9 10 11 |
$child_pid = pcntl_fork(); if (($child_pid==0) or ($child_pid==-1)){ // -1 если дочерний процесс стартовать не удалось //здесь много грузящей процессор работы PutLog(messageslogfile, BOn."--завершил дочерний процесс", true); if ($child_pid!=-1){ posix_kill(posix_getpid(), SIGKILL);}; // если продолжаем в основном потоке, то и кончаем его } else { PutLog(messageslogfile, BOn."--стартовал дочерний процесс", true); }; |
Проблема возникает из за того, что нам нужно как-то отчитаться в главный процесс, что дочерний процесс завершен, и только тогда ОС поймёт, что зомби можно убирать. Классически для этого используют pcntl_wait, но рабочих примеров найти не смог.
Решение: объявим, что нам собственно всё равно что происходит с «детьми»:
1 |
pcntl_signal(SIGCHLD, SIG_IGN); |
После этого зомби-процессы плодиться перестают