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

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

10 голосов
/ 05 декабря 2011

Для веб-сайта мне нужно иметь возможность запускать и останавливать процесс демона.В настоящее время я занимаюсь

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 05 декабря 2011

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

Так вот:

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

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

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

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

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

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

$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);
0 голосов
/ 05 декабря 2011

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

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