PHP exec () возвращает значение для фонового процесса (Linux) - PullRequest
1 голос
/ 07 октября 2009

Используя PHP в Linux, я хотел бы определить, была ли команда оболочки, запущенная с использованием exec (), успешно выполнена. Я использую параметр return_var для проверки успешного возвращаемого значения 0. Это прекрасно работает, пока мне не нужно сделать то же самое для процесса, который должен выполняться в фоновом режиме. Например, в следующей команде $ result возвращает 0:

exec('badcommand > /dev/null 2>&1 &', $output, $result);

Я специально поместил перенаправление туда, я не хочу захватывать какой-либо вывод. Я просто хочу знать, что команда была выполнена успешно. Это возможно сделать?

Спасибо, Брайан

Ответы [ 3 ]

3 голосов
/ 07 октября 2009

Я предполагаю, что то, что вы пытаетесь сделать, напрямую невозможно. Благодаря фоновому процессу вы позволяете своему сценарию PHP продолжаться (и, возможно, завершаться) до того, как результат будет достигнут.

Обходной путь - создать второй скрипт PHP (или Bash / etc), который просто выполняет команду и записывает результат во временный файл.

Основной скрипт будет выглядеть примерно так:

$resultFile = '/tmp/result001';
touch($resultFile);
exec('php command_runner.php '.escapeshellarg($resultFile).' > /dev/null 2>&1 &');

// do other stuff...    

// Sometime later when you want to check the result...
while (!strlen(file_get_contents($resultFile))) {
    sleep(5);
}
$result = intval(file_get_contents($resultFile));
unlink($resultFile);

И command_runner.php будет выглядеть так:

$outputFile = $argv[0];
exec('badcommand > /dev/null 2>&1', $output, $result);
file_put_contents($outputFile, $result);

Это не красиво, и, безусловно, есть место для повышения надежности и обработки одновременных выполнений, но общая идея должна работать.

1 голос
/ 27 августа 2010

Только мои 2 цента, как насчет использования оператора || или && bash?

exec('ls && touch /tmp/res_ok || touch /tmp/res_bad');

А затем проверьте наличие файла.

1 голос
/ 07 октября 2009

Не используется метод exec (). Когда вы отправляете процесс в фоновый режим, он возвращает 0 вызову exec, а php продолжает выполнение, и нет способа получить окончательный результат.

pcntl_fork (), тем не менее, разветвит ваше приложение, так что вы можете запустить exec () в дочернем процессе и оставить его в ожидании завершения. Затем exit () со статусом, возвращенным вызовом exec. В родительском процессе вы можете получить доступ к этому коду возврата с помощью pcntl_waitpid ()

...