voroshil's Blog

Здесь должно быть что-то умное

Использование VLC в Ubuntu в качестве сетевого медиа-сервера

Постановка задачи

Цель: Реализовать потоковое вещание с двух спутниковых тарелок в сеть, используя имеющийся сервер с двумя 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 вполне можно использовать.
  • построить распределенную систему вещания (создав целые "гирлянды" из медиа-серверов)