A zombie процесс не обязательно сам по себе плохой.Это означает, что процесс child умер, а процесс parent еще не получил своего статуса (используя wait()
или связанный системный вызов).
Чтопроисходит следующее: cron
заинтересован в stderr из сценария, который он запускает (чтобы он мог отправить его вам по электронной почте в случае сбоя сценария), поэтому он создает pipe который присоединяет stderr сценария к концу записи (дескриптор файла 2).Затем cron
сидит, читая в конце канала чтения, ожидая, когда скрипт завершит работу, и прочитает eof (read()
из нулевых байтов) - тогда он получит статус возврата скрипта.
В вашем примере, порожденный демон, наследует файловый дескриптор stderr , и поэтому, когда промежуточная оболочка выходит (и перестает работать), канал остается открытым демоном.Поэтому cron
никогда не читает eof и, следовательно, никогда не получает статус возврата.
Решение состоит в том, чтобы гарантировать, что stderr вашего демона закрыт.Это может быть достигнуто следующим образом:
0-59 * * * * /var/www/html/private/fivemin/zdaemon.php >> /dev/null 2>&1 &
, в котором будет записано оба стандартный вывод и стандартный поток в /dev/null