dmitrydeco
@dmitrydeco

Почему останавливается скрипт с использованием exec?

Привет. Схема следующая: основной сервер отсылает медиа-файл с помощью rsync на другой сервер. На этом сервере есть скрипт, который обрабатывает медиа-файл, вызывая через exec команду ffmpeg с некоторыми параметрами, после чего отправляет данные через gearman обратно (говоря о том, что задача выполнена), а так же команду на скачивание этого самого файла со второго на основной. Проблема в том, что через несколько таких последовательных итераций (обрабатывает 5-10 файлов) скрипт заканчивает свою работу на функции exec (ставил обычные echo перед и после exec), не выдавая никаких ошибок (error_reporting и тд включены), причём иногда останавливая конвертацию на середине. Пробовал отслеживать память скрипта - всё в норме. В логах supervisor'а, в логах самого скрипта и gearman'а ничего нет. Куда копать?

P.S.
echo 1;
exec("ffmpeg -y -i $filepath -vf scale={$scale},setsar=1:1 -vcodec libx264 -b:v {$px['b']}k -acodec copy -threads ".(exec('nproc') - 1)." -bufsize 2000k -minrate 0k -maxrate 1450k ".$new_filepath, $output, $result_int);
echo 2;

Обрывается после вывода "1";
  • Вопрос задан
  • 456 просмотров
Пригласить эксперта
Ответы на вопрос 3
@grinat
Сделай через proc open и лови вcе шо творится. В ffmpeg проставь loglevel на максимум, вероятно exit code > 0
Ответ написан
@magarif
Программист
Ни строчки кода)

Вот эту страничку прочитайте, пункты "Замечания", возможно что-то подойдет)
php.net/manual/ru/function.exec.php

Ну и смотрите что возвращает третий параметр $return_var
string exec ( string $command [, array &$output [, int &$return_var ]] )
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
А что дает непосредственный запуск этой команды в консоле? Т.е. берем, тест команды выносим в переменную и логируем. Упавшие варианты запускаем руками.
$cmd = "ffmpeg -y -i $filepath -vf scale={$scale},setsar=1:1 -vcodec libx264 -b:v {$px['b']}k -acodec copy -threads ".(exec('nproc') - 1)." -bufsize 2000k -minrate 0k -maxrate 1450k " . $new_filepath;
echo $cmd;
exec($cmd, $output, $result_int);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы