На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
vdereberya
Сообщения: 1
ОС: centos
Сообщение
vdereberya » 07.05.2014 14:45
Помогите доработать скрипт.
Есть задача: отслеживать добавление видео файлов в пользовательскую папку, конвертировать их в нужный формат.
Мониторинг папки ведется с помощью inotify tools, конвертирование – ffmpeg.
Сейчас скрипт конвертирование выполняет, но делает это одновременно со всеми файлами. Нужно что бы была возможность задавать количество одновременных конвертаций (например параллельно 5) или вести конвертирование поочередно.
Код: Выделить всё
#!/bin/bash
INOTIFY_CMD="/usr/bin/inotifywait"
from="/home/incoming/No_converted"
tmp="/home/incoming/Converted_bash/tmp"
to="/home/incoming/Converted"
Mov_dir="/home/incoming/Mov_dir"
normal='_normal'
mobile='_mobile'
LOGO="/home/incoming/Converted_bash/tmp/logo.png"
"$INOTIFY_CMD" -e close_write -e moved_to -m "$from" --format='%f' | \
while read F; do
(
sleep 3
mv "$from/$F" "$tmp/$F"
ffmpeg -y -i "$tmp/$F" -s 710x568 -vcodec libx264 -b 6395000 -aspect 4:3 -r 25.000 -vf crop=in_w-2*6:in_h-2*4 -vf format=yuv420p -ab 96k -ar 48000 -map 0:0 -map 0:1 -map 0:1 -map_channel 0.1.0:0.1 -map_channel 0.1.2:0.1 -map_channel 0.1.1:0.2 -map_channel 0.1.3:0.2 -strict -2 -metadata:s:a:0 language=ukr -metadata:s:a:1 language=rus -vf "movie="$LOGO" [wm];[in][wm] overlay=600:100 [out]" "$to/$F$normal".mp4 2> "$to/$F$normal".log
md5sum "$to/$F$normal".mp4 > "$to/$F$normal".md5
cp "$to/$F$normal".mp4 "$to/$F$normal".md5 "$Mov_dir/"
ffmpeg -y -i "$tmp/$F" -s 480x384 -vcodec libx264 -b 6395000 -aspect 4:3 -r 25.000 -vf crop=in_w-2*6:in_h-2*4 -vf format=yuv420p -ab 96k -ar 48000 -map 0:0 -map 0:1 -map 0:1 -map_channel 0.1.0:0.1 -map_channel 0.1.2:0.1 -map_channel 0.1.1:0.2 -map_channel 0.1.3:0.2 -strict -2 -metadata:s:a:0 language=ukr -metadata:s:a:1 language=rus -vf "movie="$LOGO" [wm];[in][wm] overlay=600:100 [out]" "$to/$F$mobile".mp4 2> "$to/$F$mobile".log
md5sum "$to/$F$mobile".mp4 > "$to/$F$mobile".md5
cp "$to/$F$mobile".mp4 "$to/$F$mobile".md5 "$Mov_dir/"
) &
done
tmp13
Сообщения: 986
ОС: openSuse 11.2
Сообщение
tmp13 » 13.05.2014 16:29
По любому мониторить количество процессов... наверное
на исходе дня...
Код: Выделить всё
#!/bin/bash
countproc=5
while true
do
currcount=`ps -e|grep sleep|wc -l`
if [ "$currcount" -lt "$countproc" ]
then
sleep 10&
fi
done
exit 0
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 13.05.2014 17:10
jobs | wc -l (работает только в bash).
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:
Сообщение
drBatty » 13.05.2014 19:30
vdereberya писал(а): ↑ 07.05.2014 14:45
Сейчас скрипт конвертирование выполняет, но делает это одновременно со всеми файлами.
я бы мониторил количество работающих в системе ffmpeg.
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 13.05.2014 20:55
vdereberya
См. "-P" для xargs. Должно получиться нечто подобное:
"$INOTIFY_CMD" -e close_write -e moved_to -m "$from" --format='%f' | xargs -I '{}' -P 5 sh -c "ffmpeg ... ; md5sum ... ; cp ..."
Или аккуратнее:
Код: Выделить всё
convert_file() {
F=$1
ffmpeg -y -i "$tmp/$F" -s 710x568 -vcodec libx264 -b 6395000 -aspect 4:3 -r 25.000 -vf crop=in_w-2*6:in_h-2*4 -vf format=yuv420p -ab 96k -ar 48000 -map 0:0 -map 0:1 -map 0:1 -map_channel 0.1.0:0.1 -map_channel 0.1.2:0.1 - map_channel 0.1.1:0.2 -map_channel 0.1.3:0.2 -strict -2 -metadata:s:a:0 language=ukr -metadata:s:a:1 language=rus -vf "movie="$LOGO" [wm];[in][wm] overlay=600:100 [out]" "$to/$F$normal".mp4 2> "$to/$F$normal".log
md5sum "$to/$F$normal".mp4 > "$to/$F$normal".md5
cp "$to/$F$normal".mp4 "$to/$F$normal".md5 "$Mov_dir/"
ffmpeg -y -i "$tmp/$F" -s 480x384 -vcodec libx264 -b 6395000 -aspect 4:3 -r 25.000 -vf crop=in_w-2*6:in_h-2*4 -vf format=yuv420p -ab 96k -ar 48000 -map 0:0 -map 0:1 -map 0:1 -map_channel 0.1.0:0.1 -map_channel 0.1.2:0.1 -map_channel 0.1.1:0.2 -map_channel 0.1.3:0.2 -strict -2 -metadata:s:a:0 language=ukr -metadata:s:a:1 language=rus -vf "movie="$LOGO" [wm];[in][wm] overlay=600:100 [out]" "$to/$F$mobile".mp4 2> "$to/$F$mobile".log
md5sum "$to/$F$mobile".mp4 > "$to/$F$mobile".md5
cp "$to/$F$mobile".mp4 "$to/$F$mobile".md5 "$Mov_dir/"
}
"$INOTIFY_CMD" -e close_write -e moved_to -m "$from" --format='%f' | xargs -I '{}' -P 5 convert_file '{}'
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:
Сообщение
serzh-z » 13.05.2014 21:02
Рабочий PoC:
Код: Выделить всё
$ for n in {1..100} ; do echo $n ; done | xargs -I '{}' -P 5 sh -c "echo 'TASK: {}' ; sleep 2"