PHP exec () возвращает значение для фонового процесса (linux)

Используя 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'); 

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