LINUX.ORG.RU

Запустить с помощью php bash скрипт в бэке.


0

0

Есть задача сделать видео конвертер с web интерфейсом.

есть bash скрипт, который узнаёт битрейты исходного видео файла
затем запускает ffmpeg .... &

если его вызвать под средством php скрипта то всё работает как надо, ffmpeg долго и нудно там себе конвертит, а php сразу завершает свою работу.

Но нужно это дело как то контролировать. Ничего в голову умнее не пришло, как сделать 2 bash скрипта:
первый запускает второй (./script2.sh &) в бэке, создаёт файл с его pid-ом, а второй в свою очередь ffmpeg, а по завершении удаляет pid файл, удобно - даже если ffmpeg грохнется, pid удалится.

Но почему то такой фокус работает, только когда я вызываю первый скрипт из консоли. А если из php скрипта, то он ждёт завершения script2.sh

Короче! Как мне выполнить шэл команду из php-cgi, чтобы не дожидаясь её завершения - завершится самому.


Положи ее куда-нибудь :) Я извращался следующим образом

У меня было несколько backend-скриптов. которые время от времени запускались в зависимости от внешних условий. Я сделал "надзирателя", который запускался по крону и смотрел базу на предмет заданий. Если таковые находил, то форкался и запускал процесс. В базе был флаг состояния - добавлен, выполняется, выполнен.

"Добавлен" - ставил фронт, "выполняется" - ставил шедулер, "выполнен", соответственно, сам скрипт.

boombick ★★★★★
()
Ответ на: комментарий от boombick

Ну да можно форкнуться скрипту. Но в баш вроде есть такая фича, что он может отвязаться от родительского процесса и встать прямо под init ? Вот только я не знаю как :)))

вот как вариант start-stop-daemon, но опять же хочется pid!

check
() автор топика
Ответ на: комментарий от check

И все равно мне не понятно, почему когда я делаю вызов команды /usr/bin/ffmpeg из script2.sh а script2.sh в свою очередь вызывается с & вконце под средством script1.sh. То всё правильно работает при вызове script1.sh из консоли, а при вызове exec('./script1.sh') из php скрипта, то он ждёт пока завершится script2

check
() автор топика
Ответ на: комментарий от check

Я тут с горяча кучу всего написал.
Короче, чтобы запустить в php с помощью exec() шэл команду в бэке, нужно помимо & в конце, обязательно перенаправить куда нибудь stdout.
exec('./exex.sh > /dev/null &');

check
() автор топика

пускай конвертилку по крону раз в минуту, конвертилка проверяет есть ли что в определенной директории. если есть - конвертит и кладет в другую.
php скрипт же просто берет и загружает файл в первую директорию.

isden ★★★★★
()

popen пробовал

enep ★★★★★
()
Ответ на: комментарий от enep

Да спасибо, всё уже закончил
Просто запускаю в php c "> /dev/null &" в конце - bash скрипт, который запускает ffmpeg средствами start-stop-daemon, тот в свою очередь создаёт pid файл, а по окончании конверта, pid удаляется. Можно было и без start-stop-daemon, и ограничиться lock файлом, но тогда проблематично было бы сделать отмену. Крон не катит, потому-что там ajax и все дела интерактивные, лишняя минута - неудобно.

а php-ffmpeg у меня вылетал с segmentation fault, но правда при взятии некоторой инфы с flv файла, которая не читалась и самим ffmpeog-ом, да и в php-ffmpeg, вроде бы как вообще нет функций для конверта, только чтение и редактирование инфы файла.

check
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.