Запуск демона из PHP

Для веб-сайта мне нужно запустить и остановить процесс демона. То, что я сейчас делаю, это

exec("sudo /etc/init.d/daemonToStart start"); 

Процесс daemon запущен, но Apache / PHP зависает. Выполнение ps aux показало, что сам sudo превратился в процесс зомби, эффективно убивая все дальнейшие успехи. Это обычное поведение при попытке запустить daeomon из PHP?

И да, Apache имеет право выполнить команду /etc/init.d/daemonToStart . Я изменил файл / etc / sudoers, чтобы он это сделал. Нет, я не позволял Apache выполнять любую команду, всего лишь немногие, чтобы сайт работал.

В любом случае, возвращаясь к моему вопросу, есть ли способ разрешить PHP запускать демоны таким образом, чтобы не создавался зомбический процесс? Я спрашиваю об этом, потому что, когда я делаю обратное, останавливая уже запущенного демона, все работает отлично.

Попробуйте добавить > /dev/null 2>&1 & к команде.

Итак, это:

 exec("sudo /etc/init.d/daemonToStart > /dev/null 2>&1 &"); 

На всякий случай вы хотите знать, что он делает / почему:

  • > /dev/null – перенаправить STDOUT на / dev / null (черная дыра, другими словами)
  • 2>&1 – перенаправить STDERR в STDOUT (черная дыра также)
  • & отсоединить процесс и запустить в фоновом режиме

У меня такая же проблема.

Я согласен с DaveRandom, вы должны подавлять каждый вывод (stdout и stderr). Но не нужно запускать в другом процессе с окончанием « & »: функция exec () больше не может проверить код возврата и возвращает ok, даже если есть ошибка …

И я предпочитаю хранить выходы во временном файле, а не «blackhole'it». Рабочее решение:

 $temp = tempnam(sys_get_temp_dir(), 'php'); exec('sudo /etc/init.d/daemonToStart >'.$temp.' 2>&1'); 

Просто прочитайте содержимое файла после и удалите временный файл:

 $output = explode("\n", file_get_contents($temp)); @unlink($temp); 

Я никогда не пробовал запускать демона из PHP, но я попытался запустить другие команды оболочки с большим трудом. Вот несколько вещей, которые я пробовал в прошлом:

  • Согласно ответу DaveRandom, добавьте /dev/null 2>&1 & в конец вашей команды. Это приведет к перенаправлению ошибок на стандартный вывод. Затем вы можете использовать этот вывод для отладки.
  • Убедитесь, что PATH вашего веб-сервера содержит все ссылочные двоичные файлы внутри вашего сценария демона. Вы можете сделать это, вызвав exec('echo $PATH; whoami;) . Это скажет вам, что пользователь работает под PHP, и это текущая переменная PATH.