PHP shell_exec () - не печатает динамический вывод, печатает только статический эхо-текст - PullRequest
2 голосов
/ 21 июля 2011
****UPDATE****
# The issue was within the wanpipemon script and the way that it interacts 
# with ioctl basically unless you want to edit the source for wanpipemon 
# and recompile it, it will not work. I have tried -S with root among 
# others and unless I am within console it throws a not authorized error 
# in the ioctl function.

Хорошо, у меня есть простой сценарий оболочки, который запускает команду и выводит линейные напряжения FXO, обычно вам нужно получать по одной строке за раз, эта комбинация объединяет их в один читаемый вывод.(не имеет отношения к этому сообщению, но я подумал, что кто-то может спросить, что делает этот скрипт)

Это скрипт оболочки:

#!/bin/bash

LINE1=$(wanpipemon -i w1g1 -c astats -m 1 | grep -m1 VOLT | cut -d ":" -f 2-2)
LINE2=$(wanpipemon -i w1g1 -c astats -m 2 | grep -m1 VOLT | cut -d ":" -f 2-2)
LINE3=$(wanpipemon -i w1g1 -c astats -m 3 | grep -m1 VOLT | cut -d ":" -f 2-2)
LINE4=$(wanpipemon -i w1g1 -c astats -m 4 | grep -m1 VOLT | cut -d ":" -f 2-2)
LINE5=$(wanpipemon -i w1g1 -c astats -m 5 | grep -m1 VOLT | cut -d ":" -f 2-2)
LINE6=$(wanpipemon -i w1g1 -c astats -m 6 | grep -m1 VOLT | cut -d ":" -f 2-2)

echo "Line 1 Voltage: $LINE1"
echo "Line 2 Voltage: $LINE2"
echo "Line 3 Voltage: $LINE3"
echo "Line 4 Voltage: $LINE4"
echo "Line 5 Voltage: $LINE5"
echo "Line 6 Voltage: $LINE6"

Запуск скрипта на компьютере через терминал, он прекрасно работаетдействительно.В моем PHP-скрипте я просто делаю это (php-скрипт находится на том же сервере, что и sh-файл):

<code><?php
    $output = shell_exec('/usr/sbin/linesta.sh');
    echo "<pre>$output
";?>

Вывод, который я получаю в запущенном браузереСценарий:

Line 1 Voltage:
Line 2 Voltage:
Line 3 Voltage:
Line 4 Voltage:
Line 5 Voltage:
Line 6 Voltage:

Теперь я убедился, что права доступа правильные, и уже должен знать, что, поскольку он работает на 50% пути, и, как я уже сказал, я знаю, что сценарий работает намашина.

Это действительно очень странно из-за того, что выводит статический текст, а не динамический текст. Команда 'wanpipemon -i w1g1 -c astats -m *' является частью приложения драйверадля аналоговой карты на моей АТС, и для ее запуска не нужен root (любой пользователь может запустить команду), поэтому меня смущает то, что происходит.

Любая помощь и / или советы по отладке будут очень полезны.оценил, до сих пор я пробовал только двойную проверку разрешений на сценарий оболочки, запустив сценарий на сервере в консоли (то есть linesta.sh), но я не уверен, что еще для тестирования. Я пробовал другую команду PHPтакие как exec () и system () с одинаковыми результатами.

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Находится ли wanpipemon в пути любой оболочки, используемой PHP для выполнения скрипта?Ошибки типа «файл не найден» будут записаны в stderr и не будут перехвачены построением вашей строки в скрипте, а также не будут перехвачены PHP, если вы не перенаправили stderr:

$output = shell_exec('/usr/sbin/linesta.sh 2>&1');
                                           ^^^^--- redirect stderr to stdout.
1 голос
/ 21 июля 2011

Есть много специфических вещей с shell_exec Я использую следующую функцию, чтобы получить весь вывод

/**
 * Executes the shell command and gets stdout and stderr streams
 *
 * @see http://www.php.net/manual/en/function.proc-open.php
 * @param string $cmd - command to be executed
 * @param string $cwd - folder
 * @param array $env - options
 * @return array()
 */
function shexec($cmd, $cwd = './', $env = array())
{
    $return_value = array(
         "exit"   => 1,       // exit 0 on ok
         "stdout" => "",      // output of the command
         "stderr" => "",      // errors during execution
    );

    $descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    2 => array("pipe", "w")   // stderr is a pipe
    );

    $process = proc_open(escapeshellcmd($cmd), $descriptorspec, $pipes, $cwd, $env);
    // $pipes now looks like this:
    // 0 => writeable handle connected to child stdin
    // 1 => readable handle connected to child stdout
    // 2 => readable handle connected to child stderr

    if (false === is_resource($process))
    {
        //echo("Sys::shexec() Error on proc_open, shell command \"$cmd\"");
    }
    else
    {
        $return_value['stdout'] = stream_get_contents($pipes[1]);
        $return_value['stderr'] = stream_get_contents($pipes[2]);

        fclose($pipes[0]);
        fclose($pipes[1]);
        fclose($pipes[2]);

        // It is important that you close any pipes before calling
        // proc_close in order to avoid a deadlock
        $return_value['exit'] = proc_close($process);
    }

    if(trim($return_value['stderr']) !== "") {
        //echo("Sys::shexec() \n\"$cmd\"\nERROR:\n" . $return_value['stderr']);
    }

    if(trim($return_value['stdout']) !== "") {
        //echo("Sys::shexec() \n\"$cmd\"\nOUTPUT:\n" . $return_value['stdout']);
    }

    return $return_value;

} // END FUNCTION shexec()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...