Для веб-сайта мне нужно запустить и остановить процесс демона. То, что я сейчас делаю, это
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, но я попытался запустить другие команды оболочки с большим трудом. Вот несколько вещей, которые я пробовал в прошлом:
/dev/null 2>&1 &
в конец вашей команды. Это приведет к перенаправлению ошибок на стандартный вывод. Затем вы можете использовать этот вывод для отладки. exec('echo $PATH; whoami;)
. Это скажет вам, что пользователь работает под PHP, и это текущая переменная PATH.