Используя PHP в Linux, я хотел бы определить, была ли успешно выполнена команда shell, выполняемая с помощью exec (). Я использую параметр return_var, чтобы проверить успешное возвращаемое значение 0. Это работает отлично, пока мне не нужно делать то же самое для процесса, который должен выполняться в фоновом режиме. Например, в следующей команде $ result возвращает 0:
exec('badcommand > /dev/null 2>&1 &', $output, $result);
Я специально перенаправил туда перенаправление, я не хочу записывать какой-либо вывод. Я просто хочу знать, что команда выполнена успешно. Можно ли это сделать?
Спасибо, Брайан
Я предполагаю, что то, что вы пытаетесь сделать, прямо не возможно. Опираясь на процесс, вы позволяете скрипту 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);
Это не очень красиво, и, безусловно, есть место для добавления надежности и обработки одновременных исполнений, но общая идея должна работать.
Не использовать метод exec (). Когда вы отправляете процесс в фоновый режим, он возвращает 0 к вызову exec, а php продолжит выполнение, нет способа получить окончательный результат.
Однако pcntl_fork () будет раскодировать ваше приложение, поэтому вы можете запустить exec () в дочернем процессе и оставить его до тех пор, пока он не завершится. Затем exit () со статусом, вызванным вызовом exec. В родительском процессе вы можете получить доступ к этому коду возврата с помощью pcntl_waitpid ()
Только мои 2 цента, как насчет использования ||
или оператор &&
bash?
exec('ls && touch /tmp/res_ok || touch /tmp/res_bad');
И затем проверьте наличие файла.