LINUX.ORG.RU
ФорумAdmin

Помогите с релизацией bash скрипта

 ,


0

3

Есть скрипт запуска ffmpeg для конвертирования видео на сервере. Запускается он у меня по крону каждые 5 мин. Хочу чтобы видео кодировалось по очереди а не скопом как это делает скрипт ( кодирует сразу 3-4 видеофайла).Тоесть 1 ffmpeg запустился, сконвертировал, сразу за ним второй итд...Я так понял нужно в баш писать проверку на запущеность процесса чтобы не дать запустить вторую копию ffmpeg. Собственно сам скрипт.

#!/bin/sh
 meta=/usr/bin/qt-faststart                                             # Добавляем метаданные для перемотки видео
 converter=ffmpeg                                                         # Путь до конвертора ffmpeg
 avifile="/var/www/site.ru/web/uploads/files"                                # Входящий AVI файл
 file_mask="*"                                                          # Ищем 0 в имени файла
    
 for i in `ls -a $avifile/*/$file_mask.avi`
  do
      i=$(echo $i | sed 's/.avi//')
      if [[ ! -e "$i.mp4" ]]
      then $converter -i $i.avi -map 0:0 -map 0:1 -vcodec libx264 -b:v 480K -maxrate 480K -r 24 -crf:v 25 -preset:v veryfast -acodec libfaac -ar 22050 -b:a
          $meta $i.mp4 $i2.mp4
          rm $i.avi
          mv $i2.mp4 $i.mp4
      else shift
      fi
  done

Заранее очень благодарен всем откликнувшимся.


в самом скрипте можно, но это будет некрасивое костыльное решение
по феншую это делается через flock

*/5 * * * * flock -n /var/run/runlock -c /my/prettty/script.sh

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

Гонок не будет, т.к. скрипт запускается каждые 5 мин. Просто в начале нужно поставить цикл пока предыдущий скрипт не закончится. В цикле надо команду sleep, чтобы ресурсы не жрало.

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

Просто в начале нужно поставить цикл пока предыдущий скрипт не закончится. В цикле надо команду sleep, чтобы ресурсы не жрало.

где гарантия что скрипт который сейчас ждёт, и ещё один (+1 новый) скрипт который запустится через 5 минут по крону — не начнут одновременно отслеживать окончание предыдущего скрипта...

....(а затем , как придыдущий скрипт закочит свою работу — сразу «настарт, внимание, МАРШ! гонка началась!» :))

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

Третий скрипт не нужен и может сразу сдохнуть. В принципе и второй наверное может сразу завершиться, тсу виднее.

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

tsp

Тоже велосипед.

Велосипед, у которого есть майнтейнер и который включен в убунточку, таковым не является.

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

В убунточку много всякого ненужного говна включено. Bash эту задачу в три строчки решает, смысл ещё что-то ставить?

emulek ()
Ответ на: комментарий от Bers666

Прошу прощения...но у меня с английским туго. Не могли бы вы расказать как это все реализовать в моем скрипте?

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

ну например так. убрать все от then до else, и вставить :

tsp -S 2 bash -c " ffmpeg ...; qt-faststart ...; mv ..; rm ..;"

будет процессить такие команды по 2 одновременно.
смотреть очередь можно

tsp -l

P.S. А хотя все равно нужны какие-то локи чтоб одинаковые задания не добавлять. Хотя перед добавлением можно смотреть по имени файла, не добавлен ли он уже в очередь. Напиши лучше демона на баш, который в вечном цикле находит файлы и их кодирует.

Bers666 ★★★★★ ()
Последнее исправление: Bers666 (всего исправлений: 1)
Ответ на: комментарий от zolden

Извиняюсь мой бок) Спасибо все работает! отрабатывает по очереди так как нужно.

ceroz ()
Ответ на: комментарий от Bers666

Спасибо за совет. 2 варинт что подскази мне уже работает. щас попробую с вашим реализовать.

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