Постановка задачи
Цель: Реализовать потоковое вещание с двух спутниковых тарелок в сеть, используя имеющийся сервер с двумя DVB картами. По возможности также предусмотреть вещание с имеющихся камер Dlink DCS-2102. Сервер должен быть в меру автономным и требовать минимум человеческого участия для своей работы. В качестве операционной системы будет использоваться Ubuntu 10.04 LTS. Функции медиасервера будет выполнять VLC media player. Этот медиаплейер не только обладает широкими возможностями по перекодированию и сетевому вещанию, но также может одновременно обрабатывать несколько медиапотоков и поддерживает различные интерфейсы удаленного управления. Управление потоками будет производиться посредством VideoLAN manager в комбинации с telnet интерфейсом. В статье рассматриваются вопросы:
- Как установить VLC в качестве службы
- Как управлять VLC посредством VLM
- Слежение за состоянием службы VLC
В статье НЕ будут рассматриваться следующие вопросы:
- Установка Ubuntu на сервер
- Настройка сети, добавление поддержки multicast
- Определение параметров и списка каналов, передаваемых со спутника.
Установка программ
В Ubuntu есть специальная сборка VLC, не требующая наличия X-сервера.
#apt-get install vlc-nox
Исполняемый файл в этом случае будет называться cvlc.
Создание службы
Чтобы не требовалось участия пользователя для запуска VLC, превратим его в системную службу. Сделать это не очень сложно. Поместите следующий текст в файл /etc/init.d/vlcd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #!/bin/sh
#
### BEGIN INIT INFO
# Provides: vlcd
# Required-Start: $network
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 6
# Short-Description: VLC trancoding daemon
# Description: This service provides streaming DVB
# channels to network
### END INIT INFO
set -e
. /lib/lsb/init-functions
VLCD_PIDDIR=/var/run/vlcd
VLCD_LOGDIR=/var/log/vlcd
VLCD_USER=vlc
VLCD_GROUP=video
VLM_CONFIG=/etc/vlcd/vlm.cfg
VLM_CONF_DIR=/etc/vlcd/vlm.conf.d
[ -r /etc/default/vlcd ] && . /etc/default/vlcd
# Daemon options
VLC_OPTS="-d --pidfile $VLCD_PIDDIR/vlcd.pid -I telnet --extraintf http"
# Logging options
VLC_OPTS="$VLC_OPTS --file-logging --logmode text --logfile $VLCD_LOGDIR/vlcd.log"
# VLM config
VLC_OPTS="$VLC_OPTS $VLC_EXTRA_OPTS"
start()
{
log_daemon_msg "Starting VLC daemon" "vlcd"
VLCD_TMPCONF="$VLCD_PIDDIR/vlmt.tmp.cfg"
echo "del media" > $VLCD_TMPCONF
if [ -r "$VLM_CONFIG" ] ; then
echo "load $VLM_CONFIG" >> $VLCD_TMPCONF
fi
if test -d "$VLM_CONF_DIR" ; then
for cfg in $VLM_CONF_DIR/*.cfg ; do
if [ -r $cfg ]; then
echo "load $cfg" >> $VLCD_TMPCONF
fi
done
fi
chown $VLCD_USER:$VLCD_GROUP $VLCD_TMPCONF
VLC_OPTS="$VLC_OPTS --vlm-conf $VLCD_TMPCONF"
start-stop-daemon --start --exec /usr/bin/vlc --group $VLCD_GROUP --chuid $VLCD_USER \
--startas /usr/bin/cvlc --pidfile $VLCD_PIDDIR/vlcd.pid -- $VLC_OPTS
log_end_msg $?
}
stop()
{
log_daemon_msg "Stopping VLCT daemon" "vlcd"
start-stop-daemon --stop --exec /usr/bin/vlc -R 2 --oknodo --pidfile $VLCD_PIDDIR/vlcd.pid
log_end_msg $?
}
case "$1" in
start)
start
;;
restart|force-reload)
stop
sleep 1
start
;;
stop)
stop
;;
status)
exit 4
;;
*)
echo "Usage: /etc/init.d/vlcd {start|stop}"
exit 2
;;
esac
exit 0
|
и сделайте его исполняемым:
#chmod +x /etc/init.d/vlcd
Поместите следующий текст в файл /etc/default/vlcd (он содержит параметры запуска VLC):
VLC_EXTRA_OPTS="--ttl=5 --http-host 0.0.0.0:10082 --rtsp-host 0.0.0.0:5554 --sap-interval 1"
Суммарно VLC будет запускаться со следующими опциями:
- --ttl=5
Устанавливает время жизни multicast пакетов (значение по умолчанию, равное 0, не позволяет пакетам проходить через маршрутизаторы) - --http-host 0.0.0.0:10082
Указывает адрес и порт для HTTP интерфейса управления (понадобится в дальнейшем для мониторинга) - --rtsp-host 0.0.0.0:5554
Указывает адрес и порт для RTSP сервера (необходимо, если планируете использовать RTSP) - --sap-interval 1
Устанавливает интервал обновления SAP анонсов - -d
Запуск VLC в качестве службы - --pidfile /var/run/vlcd/vlcd.pid
Указывает файл, содержащий PID процесса VLC (необходим для корректного запуска/останова службы) - -I telnet
Запускает telnet интерфейс для управления - --extraintf http
Дополнительно запускает HTTP интерфейс управления - --file-logging --logmode text --logfile /var/log/vlcd.log
Включает журналирование в файл, указывает формат и имя файла журнала - --vlm-conf /var/run/vlcd/vlmt.tmp.cfg
Указывает временный файл конфигурации для инициализации модуля VLM (автоматически создается скриптом при запуске)
Запустите следующий скрипт с правами root:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/bin/bash
# Создаем системного пользователя с домашним каталогом /var/log/vlcd и запрещаем ему вход
adduser --system --ingroup video --no-create-home --disabled-password --home /var/log/vlcd \
--shell /bin/false vlc
# Создаем каталог для журналов
mkdir /var/log/vlcd
chown vlc:adm /var/log/vlcd
chmod u=rwx,g=rx,o=rx /var/log/vlcd
# Создаем каталог для PID файла
mkdir /var/run/vlcd
chown vlc:adm /var/run/vlcd
chmod u=rwx,g=rxs,o= /var/run/vlcd
# Добавляем vlcd в автозапуск
update-rc.d vlcd defaults
# Создаем каталоги для файлов конфигурации модуля VLM
mkdir -p /etc/vlcd/vlm.avail.d
mkdir -p /etc/vlcd/vlm.conf.d
# Добавляем правило для multicast потока в таблицу маршрутизации
echo "route add -net 224.0.0.0/4 dev eth0" >> /etc/rc.local
|
Он создаст нового пользователя, под которым будет запускаться VLC и все необходимые каталоги. После чего создаст службу и добавит правило в таблицу маршрутизации для multicast потока. Принадлежность группе video позволит VLC иметь доступ к DVB устройствам. На этом создание службы можно считать законченным. Однако VLC пока что малополезен, поскольку понятия не имеет что и куда нужно вещать.
Настройка VLM
Общие сведения
VLM в работе оперирует таким понятием как медиапоток (media). Медиапоток представляет собой некий именованный объект, состоящий из набора входных потоков данных (между которыми можно переключаться), выходного потока и, возможно, параметров. Медиапотоки можно динамически создавать, удалять, запускать и останавливать. В качестве входного потока может использоваться любой источник, который в состоянии воспроизвести ваша сборка VLC. Аналогично, выходным потоком может являться любой выходной поток, поддерживаемый VLC. К сожалению, далеко не все параметры пока можно настраивать посредством VLM, именно поэтому часть из них пришлось вынести в строку запуска. Управление VLM осуществляется с помощью команд, последовательность которых можно записывать в файлы. Описание команд можно найти на странице официальной документации VLM. Нам потребуются следующие:
- new mediastream broadcast {enabled|disabled} [loop]
Создает новый активный (enabled) или выключенный (disabled) медиапоток с именем mediastream. Попытка создать поток, имя которого совпадает с существующим, приведет к ошибке. Ключевое слово loop означает, что при завершении входного потока будет попытка воспроизвести его заново (нужно на случай обрыва связи при вещании из сети или для зацикленного воспроизведения локального файла). - del mediastream
Удаляет медиапоток с именем medisatream. Попытка удаления несуществующего потока приведет к ошибке. - control mediastream {play|stop}
Запускает (play) или останавливает (stop) медиапоток с именем mediastream. - setup mediastream input <опции>
Устанавливает параметры входящего потока для медиапотока mediastream. - setup mediastream output <опции>
Устанавливает параметры исходящего потока для медиапотока mediastream. - del media
Удаляет все медиапотоки - load filename.cfg
Последовательно выполняет команды VLM, записанные в файле filename.cfg Замечание: если одна из команд файла приведет к ошибке, то остаток файла будет проигнорирован
Скрипт запуска службы, приведенный ранее, написан так, что VLC после старта будет сначала пытаться выполнить VLM команды из файла /etc/vlcd/vlm.conf, а потом изо всех файлов с расширением .cfg, расположенных в /etc/vlcd/vlm.conf.d Поместим в файл /etc/vlcd/vlm.cfg следующий текст:
new S-0 broadcast disabled
new S-1 broadcast disabled
new webcam1 broadcast disabled
new webcam2 broadcast disabled
Тем самым при запуске VLC будут созданы четыре неактивных ненастроенных медиапотока: два для спутников (S-0, S-1) и два для камер (webcam1, webcam2).
Настройка видеокамер
Файлы конфигурации для камер довольно просты: /etc/vlcd/vlm.avail.d/cam_web1.cfg
del webcam1
new webcam1 broadcast enabled loop
setup webcam1 input rtsp://webcam1.example.com/play1.rdp
setup webcam1 output #duplicate{dst=rtp{mux=ts,dst=224.2.128.12.post=15000,sap,name="Webcam1"},dst=standard{access=http,mux=ps,dst=0.0.0.0:8082}}
control webcam1 play
/etc/vlcd/vlm.avail.d/cam_web2.cfg
del webcam2
new webcam2 broadcast enabled loop
setup webcam2 input rtsp://webcam2.example.com/play1.rdp
setup webcam2 output #duplicate{dst=rtp{mux=ts,dst=224.2.128.12.post=16000,sap,name="Webcam2"},dst=standard{access=http,mux=ps,dst=0.0.0.0:8083}}
control webcam2 play
Попробуем разобрать их подробнее.
- del webcam1
Удаление существующего потока webcam1 (он был создан в vlm.conf). Помним, что нельзя удалять несуществующие потоки. Если же такой поток в vlm.conf отсутствовал, то данная команда приведет к ошибке и остаток файла будет проигнорирован. - new webcam1 broadcast enabled loop
Создается новый активный закольцованный медиапоток webcam1. - setup webcam1 inut rtsp://webcam1.example.com/play1.rdp
Указывает, что в качестве входного потока будет использоваться RTP поток с видеокамеры Dlink, расположенной по адресу webcam1.example.com Размер изображения и частота кадров задаются в настройках камеры. - setup webcam1 output #duplicate{dst=rtp{mux=ts,dst=224.2.128.12,port=15000,sap,name="Webcam1"},dst=standard{access=http,mux=ps,dst=0.0.0.0:8082}}
Указывает, что VLC будет создавать два медиапотока (ключевое слово #duplicate). Один из них - MPEG TS видео по multicast адресу 224.2.128.2:15000. При этом по сети будут рассылаться SAP анонсы, в которых данный поток будет присутствовать под именем "Webcam1". Второй - обычный HTTP unicast поток (для целей контроля за потоком, например), доступный на порту 8082 нашего медиа-сервера.
Заметьте, что в данном случае VLC не занимается перекодированием аудио/видео, тем самым почти не нагружая процессор. Если же вам потребуется перекодировать поток (изменить размер изображеня, аудио/видео кодек, и т.п.) обратитесь к документации VLC (не VLM) и соответствующим образом исправьте строку output. Еще раз подчеркну, параметры, указываемые после input и output являются обычными опциями командной строки VLC для входных (обычно указываются последними) и выходных (указываются после --sout ) потоков соответственно.
Настройка спутникового вещания
Настроить вещание с DVB карт существенно сложнее. Во-первых, с каждой карты в отдельный момент времени можно получить поток ровно с одного транспондера (пакет каналов, передаваемых на одной частоте). Во-вторых, некоторые карты с аппаратным декодером сигнала не умеют транслировать весь пакет, требуя указать конкретный канал. Таким образом, количество транслируемых каналов будет определяться не столько производительностью сервера, сколько возможностями имеющихся DVB карт и составом каналов, транслирующихся со спутника. Далее предполагается, что вы имеете базовые знания в области работы с DVB картами. В моем случае в наличии имеются две недорогие DVB карты, обе способны транслировать полный пакет каналов с одного транспондера:
$dmesg | grep DVB
DVB: registering new adapter (TT-Budget-S-1401 PCI)
DVB: registering adapter 0 frontend 0 (Philips TDA10086 DVB-S)
DVB: registering new adapter (TT-Budget/WinTV-NOVA-CI PCI)
DVB: registering adapter 1 frontend 0 (ST STV0299 DVB-S)
Управление картами происходит по следующей схеме: Каждой карте выделяется отдельный медиапоток (в моем случае S-0 - для первого адаптера и S-1 - для второго). Это позволит управлять каждым адаптерами по отдельности. Для каждого транспондера каждой карты создается отдельный файл с командами VLM для настройки DVB адаптера и выходных потоков. Переключение каналов осуществляется запуском VLM команд и нужного файла. Все файлы конфигурации располагаются в каталоге /etc/vlcd/vlm.avail.d В папке /etc/vlcd/vlm.conf.d создаются две (по количеству DVB карт) символические ссылки на файлы конфигурации текущих транспондеров. Это позволит в случае перезапуска VLC переключиться на те же каналы, что транслировались ранее. Для удобства файлы именуются по принципу s-<name>.cfg, где DVB# - номер карты, - краткое имя транспондера. Рассмотрим пример файла для одного из транспондеров спутника Ямал-201 /etc/vlcd/vlm.avail.d/s0-gazcom.cfg:
del S-0
new S-0 broadcast enabled
setup S-0 input dvb://
setup S-0 option dvb-adapter=0
setup S-0 option dvb-frequency=3645000
setup S-0 option dvb-srate=28000000
setup S-0 option dvb-fec=3
setup S-0 option dvb-voltage=18
setup S-0 option ttl=4
setup S-0 option dvb-caching=500
setup S-0 option programs=11,12,13,14,15,16,17
setup S-0 output #duplicate{
dst=rtp{mux=ts,dst=224.2.128.2,port=15000,sap,name="(V)TV ZVEZDA +7"},select="program=11",
dst=rtp{mux=ts,dst=224.2.128.3,port=15000,sap,name="(V)TV ZVEZDA +2"},select="program=12",
dst=rtp{mux=ts,dst=224.2.128.4,port=15000,sap,name="(V)NTV7"},select="program=13",
dst=rtp{mux=ts,dst=224.2.128.5,port=15000,sap,name="(V)TNT"},select="program=14",
dst=rtp{mux=ts,dst=224.2.128.6,port=15000,sap,name="(V)DTV +7"},select="program=15",
dst=rtp{mux=ts,dst=224.2.128.7,port=15000,sap,name="(V)GDE I KTO"},select="program=16",
dst=rtp{mux=ts,dst=224.2.128.8,port=15000,sap,name="(V)RTR 2"},select="program=17"}
control S-0 play
Внимание! Строчка "setup S-0 output ..." разбита на несколько частей исключительно для удобства чтения! В реальной конфигурации все, что начинается с "setup S-0 output" и до пустой строки перед "control S-0 play" должно быть записано в одну строку.
- del S-0
Удаляется существующий медиапоток S-0. Это приводит к тому, что трансляция с первой DVB карты останавливаеттся. - new S-0 broadcast enabled
Создается новый медиапоток для трансляции с первой карты. - setup S-0 input dvb://
Указывает, что источником будет являться DVB карта. - setup S-0 option dvb-adapter=0
Номер DVB карты - setup S-0 option dvb-frequency=3645000
Частота транспондера в Гц (определяется из открытых источников или путем сканирования частот на спутнике). - setup S-0 option dvb-srate=28000000
Указывает величину символьного потока (определяется аналогично частоте). - setup S-0 option dvb-fec=3
Указывает тип коррекции сигнала (определяется аналогично частоте). - setup S-0 option dvb-voltage=18
Изменением напряжения переключает поляризацию на приемнике (поляризация определяется аналогично частоте). - setup S-0 option ttl=4
Время жизни multicast пакетов. - setup S-0 option dvb-caching=500
Размер буфера в миллисекундах. Помогает при не очень стабильном сигнале. - setup S-0 option programs=11,12,13,14,15,16,17
Указывает список PID'ы программ, которые VLC будет ретранслировать. PID можно выяснить сканированием транспондера. - setup S-0 output #duplicate{
Настраивает выходной поток. В данном случае будет создано несколько выходных потоков. - dst=rtp{mux=ts,dst=224.2.128.2,port=1500}
,sap,name="(V)TV ZVEZDA +7"},select="program=11",
Настраивает один из выходных потоков. Тип потока - RTP multicast по адресу 224.2.128.2: 15000 с SAP анонсами. В поток будет транслироваться ТОЛЬКО программа с PID=11. В списке каналов, рассылаемом посредством SAP, канал будет виден как "(V)TV ZVEZDA +7" - control S-0 play
Запускает трансляцию
Управление VLM
Модулем VLM можно управлять двумя способами: через HTTP посредством XML файлов определенного формата и через telnet просто указывая команды VLM. Я выбрал telnet ввиду простоты управления как из консоли, так и из скриптов. Фактически, в описанной конфигурации все управление сводится в подключении по telnet и вводу команды "load /path/to/filename.cfg". Все остальное сделают команды в файле. Для облегчения работы используется специальный скрипт на языке expect.
/usr/bin/vlm_load_cfg:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/expect -f
spawn telnet 127.0.0.1 4212
expect "Password:"
send "admin\r"
expect ">"
send "load /etc/vlcd/vlm.avail.d/[lrange $argv 0 1]\r"
expect ">"
send "quit\r"
exit
|
Для автоматизации процесса переключения каналов по расписанию, а также корректного переключения на последние каналы после перезапуска VLC используется еще один вспомогательный скрипт.
/usr/bin/vlm_load_sched:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #!/bin/sh
VLM_CONF_DIR=/etc/vlcd/vlm.conf.d
#VLM_CONF_DIR=`pwd`
VLM_AVAIL_DIR=/etc/vlcd/vlm.avail.d
#DEBUGOUT=/dev/null
DEBUGOUT=/var/log/vlcd/vlm.cron.log
date >> $DEBUGOUT
#echo "$*" $DEBUGOUT
SAT_NUM=0
for chan_name in $* ; do
if test "$chan_name" = "nop" ; then
echo "'nop' action. Skipping SAT #${SAT_NUM}" >> $DEBUGOUT
else
CFG_BASE_NAME="s${SAT_NUM}-${chan_name}.cfg"
CFG_NAME="${VLM_AVAIL_DIR}/${CFG_BASE_NAME}"
BCK_CFG_BASE_NAME="s${SAT_NUM}-schedule.cfg"
BCK_CFG_NAME="${VLM_CONF_DIR}/${BCK_CFG_BASE_NAME}"
if test -r ${CFG_NAME} ; then
echo "Creating failover link ${BCK_CFG_BASE_NAME} for ${CFG_BASE_NAME} ..." >> $DEBUGOUT
ln -fs ${CFG_NAME} ${BCK_CFG_NAME}
echo "Executing $CFG_BASE_NAME" >> $DEBUGOUT
vlm_load_cfg $CFG_BASE_NAME >> $DEBUGOUT
echo >> $DEBUGOUT
else
echo "Unable to run $CFG_NAME" > /dev/stderr
fi
fi
SAT_NUM=$((SAT_NUM+1))
done
|
При его запуске с параметрами:
$vlm_sched_cfg prog1 prog2
будут выполнены команды из файлов /etc/vlcd/vlm.avail.d/s0-prog1.cfg и /etc/vlcd/vlm.avail.d/s1-prog2.cfg, а также созданы две символические ссылки: /etc/vlcd/vlm.conf.d/s0-schedule.cfg и /etc/vlcd/vlm.conf.d/s1-schedule.cfg, указывающие на вышеупомянутые файлы. Ссылки как раз и обеспечат включение нужных каналов при запуске, т.к. при старте службы будут выполнены все файлы из каталога /etc/vlcd/vlm.conf.d
В качестве имени программы можно передать специальное ключевое слово nop, означающее, что каналы на данной карте (в соответствии с порядком указания) переключаться не будут.
На этом работу по настройке VLM можно считать оконченной. Можно запустить службу:
#/etc/init.d/vlcd start
Мониторинг потребления памяти
Увы, VLC при длительной работе с DVB излишней стабильностью не страдает, особенно в части утечек памяти. В версии 1.0.6-1ubuntu1 (Ubuntu 10.04) ситуация значительно улучшилась, теперь он способен проработать без сюрпризов как минимум неделю (на 9.04 он съедал 2Гб оперативной памяти примерно за сутки/двое, на 10.10 достаточно пары минут). Однако время от времени он по-прежнему сходит с ума и либо поглощает оперативную память, пока процесс не упадет с "Out of memory", либо просто зависает (что, к счастью случается крайне редко).
По этой причине состояние процесса необходимо отслеживать и перезапускать vlc при необходимости).
Создайте файл /usr/bin/check_proc_mem со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/sh
PIDFILE=/var/run/vlcd/vlcd.pid
CRIT=60
if [ ! -r "$PIDFILE" ] ; then
echo "CRITICAL - PID file ($PIDFILE) not exists or not readable. Restarting VLCD"
/etc/init.d/vlcd restart
exit 0
fi
vlcpid=`cat /var/run/vlcd/vlcd.pid`
proc=`ps p "$vlcpid" -o vsz=,pmem= | sed -e "s/\..*//"`
if [ -z "$proc" ] ; then
echo "CRITICAL - process with given PID is not running. Restarting VLCD"
/etc/init.d/vlcd restart
exit 0
fi
mem=`echo "$proc" |awk '{print $1;}'`
mempct=`echo "$proc" |awk '{print $2;}'`
if [ "$mempct" -ge "$CRIT" ]; then
echo "CRITICAL - mem=$mem,pct=$mempct|mem=$mem,pct=$mempct"
/etc/init.d/vlcd restart
exit 0
fi
exit 0
|
и добавьте его запуск в /etc/crontab:
*/5 * * * * * root /usr/bin/check_proc_mem
Мониторинг при помощи Nagios
Если качестве системы мониторинга уже используется Nagios, то будет логичным возложить обязанности отслеживания состояния VLC на нее.
Установка дополнительных пакетов
Необходимо установить поддержку NRPE на медиа-сервере:
#apt-get install nagios-nrpe-server
Убедитесь, что файл /etc/nagios/nrpe.cfg содержит следующие строки (создайте при необходимости):
# Добавляет адрес сервера Nagios в список разрешенных
allowed_hosts=127.0.0.1,<ip of nagios server>
# Разрешает передавать параметры плагинам NRPE
dont_blame_nrpe=1
# Конфигурация плагинов
command[check_proc_mem]=/usr/lib/nagios/plugins/check_proc_mem $ARG1$ $ARG2$ $ARG3$
command[restart_vlcd]=/usr/bin/sudo /etc/init.d/vlcd restart
При помощи visudo добавьте в /etc/sudoers следующие строки:
nagios ALL=(ALL) NOPASSWD: /etc/init.d/vlcd restart
Создайте в /usr/lib/nagios/plugins скрипт check_proc_mem со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/sh
#PIDFILE=/var/run/vlcd/vlcd.pid
PIDFILE=$1
WARN=$2
CRIT=$3
if [ ! -r "$PIDFILE" ] ; then
echo "CRITICAL - PID file ($PIDFILE) not exists or not readable"
exit 2
fi
vlcpid=`cat /var/run/vlcd/vlcd.pid`
proc=`ps p "$vlcpid" -o vsz=,pmem= | sed -e "s/\..*//"`
if [ -z "$proc" ] ; then
echo "CRITICAL - process with given PID is not running"
exit 2
fi
mem=`echo "$proc" |awk '{print $1;}'`
mempct=`echo "$proc" |awk '{print $2;}'`
if [ "$mempct" -ge "$CRIT" ]; then
echo "CRITICAL - mem=$mem,pct=$mempct|mem=$mem,pct=$mempct"
exit 2
fi
if [ "$mempct" -ge "$WARN" ]; then
echo "WARNING - mem=$mem,pct=$mempct|mem=$mem,pct=$mempct"
exit 1
fi
echo "OK - mem=$mem,pct=$mempct|mem=$mem,pct=$mempct"
exit 0
|
Это так называемый check plugin для Nagios. Принимает три параметра. Первый - путь к файлу, содержащему PID интересующего процесса. Второй - предел для предупреждения, третий - критический предел. Скрипт запускает ps для нужного процесса и определяет количество потребляемой памяти.
Дальнейшая настройка производится на сервере Nagios.
Описание медиа-сервера в Nagios
Создайте в /etc/nagios файл mediaserver.cfg со следующим содержимым:
define host{
use linux-server
host_name mediaserver
address <ip_of_media_server>
}
define command {
command_name restart_remote_vlcd
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ restart_vlcd
}
и добавьте в /etc/nagios/nagios.cfg строку:
cfg_file=/etc/nagios/mediaserver.cfg
Зависание
При зависании процесса VLC он перестает отвечать на порту HTTP интерфейса управления. Поэтому достаточно проверять ответ на соответствующем TCP порту. Добавляем в /etc/nagios/mediaserver.cfg:
define service {
use generic-service
host_name mediaserver
service_description VLC web interface
check_command check_nrpe!check_proc_mem -a /var/run/vlcd/vlcd.pid 50 60
normal_check_interval 1
retry_check_interval 1
max_check_attempts 1
check_command check_tcp!10082
event_handler restart_remote_vlcd
}
Утечки памяти
Добавляем в /etc/nagios/mediaserver.cfg:
define service {
use generic-service
host_name mediaserver
service_description PROC MEM vlcd
check_command check_nrpe!check_proc_mem -a /var/run/vlcd/vlcd.pid 50 60
normal_check_interval 5
retry_check_interval 1
event_handler restart_remote_vlcd
}
Заключение
Если все было сделано верно, то теперь у вас в наличии есть собственный медиа-сервер передающий в сеть видео как со спутника, так и видеокамер.
Минусы
- Не очень стабильная работа VLC из-за чего, в частности, пришлось отказаться от перекодирования потоков
- Сложность настройки output потоков
- Удаленное переключение каналов придется продумывать и реализовывать отдельно (пока - только по расписанию)
Что еще можно сделать:
- формировать все скрипты в deb-пакет.
- транслировать не только сигнал со спутников и вебкамер, но и локальные файлы, слайдшоу.
- задействовав плагины, можно добавлять собственное лого на изображение, формировать видео типа Picture-in-Picture
- одновременно с трансляцией записывать потоки в файл на диске.
- организовывать и web-трансляции средствами VLC, но опять же стабильности такого решения будет под вопросом. Хотя в качестве бэкенда VLC вполне можно использовать.
- построить распределенную систему вещания (создав целые "гирлянды" из медиа-серверов)