Почему shell_exec ничего не возвращает?

440
07 января 2017, 16:27

Цель такая - один скрипт может запускать/убивать другие скрипты-демоны. Для этого я использую shell_exec(), сохраняю PID и потом управляю процессами через функцию shell_exec(). Это в принципе нормально? Возник вопрос относительно использования этой функции. Вот фрагмент кода скрипта, который должен запускать демона:

echo exec('php -f testd.php &');

После этой строки скрипт ничего не выводит, а приостанавливает свое выполнение, будто чего-то ожидая. В это время демон testd.php работает. После принудительной остановки скрипта, демон тоже прекращает свою работу. При этом если выполнить такую же команду php -f testd.php & в терминале, то всё работает так, как и задумано - демон запускается отдельным процессом и в терминал выводится его PID. Но весь вывод демона попадает в тот же терминал, из которого он был запущен, так ведь не должно быть... Что я делаю не так?

Answer 1

В документации к exec написано:

Для получения вывода исполняемой программы, убедитесь, что параметр output инициализирован и используется.

Я подозреваю, что нужно сделать как-то так:

$output = array();
exec($command , $output);
print_r($output);

После этой строки скрипт ничего не выводит, а приостанавливает свое выполнение, будто чего-то ожидая.

Он ожидает конца выполнения вашего демона. Добавьте к вашей команде вывод в /dev/null вот так php -f testd.php > /dev/null 2>&1 & echo $!. Тогда скрипт не будет ждать завершения демона и получит pid.

Answer 2
<?php
$response = array()
exec('whoami', $response);
print_r($response,true);
?>
READ ALSO
Проверка наличия строк в файле

Проверка наличия строк в файле

Доброго времени сутокПодскажите пожалуйста

397
Magento. Не грузятся изображения и js-файлы

Magento. Не грузятся изображения и js-файлы

После установки на локальный сервер Openserver не грузятся изображения и яваскриптыНапример http://magento2

436
Ошибка при подключении к PDO: php_network_getaddresses: getaddrinfo failed

Ошибка при подключении к PDO: php_network_getaddresses: getaddrinfo failed

Салют народ, крч у меня не хочет подключаться

429