Материал из RuVDRWiki
#!/bin/bash
### BEGIN INIT INFO
# Provides: vdr
# Required-Start: $local_fs $syslog $networking
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop vdr
# Description: start and stop Video Disk Recorder (vdr)
### END INIT INFO
#export LD_ASSUME_KERNEL=2.4.1
. /lib/lsb/init-functions
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export NAME="vdr"
export HOME="/tmp"
SELFPATH="$0"
OTHER_OPTS="-l3" # Опции, которые всегда будут передаваться VDR в независимости, что прописанно в /etc/vdr/config/vdr.conf (OTHER_OPTS=" ... " )
LOG="/dev/tty9"
DVBDEVICE="all" # Здесь можно прописать номер/а адаптера DVB -карты, которые должен использовать VDR. При "all" используются все доступные.
VDRTTY="10"
CODEPAGE="ISO-8859-15" # Переменная $CODEPAGE, которая содержит ISO-8859-15
SELFNAME=`basename $0` # Переменная $SELFNAME, которая содержит вывод команды (basename $0) внутри скрипта
VDRCONF=`expr "$SELFNAME" : '.*run\(vdr.*\)'`
VDRBIN=$VDRCONF
VIDEODIR="/var/lib/$VDRCONF/video.0" # Путь к каталогу video
if [ -e /etc/$VDRCONF/config/vdr.conf ]; then
. /etc/$VDRCONF/config/vdr.conf
else
log_warning_msg "$SELFNAME: no config file found, /etc/$VDRCONF/config/vdr.conf, can't start vdr"
exit 0
fi
# В этом IF-блоке происходит проверка на существование файла /etc/$VDRCONF/config/vdr.conf, если его нет, то скрипт пишет об этом в лог и заканчивает работу.
export VDR_CHARSET_OVERRIDE=$CODEPAGE #
export LC_ALL=en_US.utf8 # Этой командой устанавливается локализация, установка активна до следущего рестарта компьютера.
if [ x$START_VDR == x"no" ]; then
log_warning_msg "Digital Videorecorder ($SELFNAME): DISABLED (START_VDR=no)"
exit 0
fi
# В этом IF-блоке проверяется строка START_VDR в файле /etc/vdr/config/vdr.conf. Если прописано no, то скрипт не стартует и заканчивает работу.
DVBDEV=""
if [ $DVBDEVICE != "all" ]; then
DVBDEV=" -D $DVBDEVICE"
fi
BINDIR="/usr/bin"
CONFDIR="/etc/$VDRCONF" # Путь к конфигурационному каталогу VDR
PLUGINDIR="/usr/lib/$VDRBIN/plugins" # Путь к модулям расширения VDR
VDRPID=0
check_vdr() {
PID=`ps auxw | grep "${VDRBIN}${DVBDEV} -L" | grep -v grep | awk '{ print $2 }'`
if [ x"$PID" != "x" ]; then
VDRPID=$PID
return 1
fi
return 0
}
parse_plugins() {
PLUGINS=""
for PLUGIN in $PLUGINLIST; do
if [ -f /etc/$VDRCONF/config/$PLUGIN.conf ]; then
. /etc/$VDRCONF/config/$PLUGIN.conf
PLUGINPARAM=$PARAM
PLUGINS="$PLUGINS -P'$PLUGIN $PLUGINPARAM'"
else
PLUGINS="$PLUGINS -P$PLUGIN"
fi
done
if [ x$USE_INTERNAL_IR == x"yes" ]; then
if [ x$INVERT_SIGNAL = x"yes" ]; then
LOADKEYS_PARAM="-i"
fi
/usr/bin/av7110_loadkeys $LOADKEYS_PARAM $RCMAP > /proc/av7110_ir
# add -Premote to $PLUGINS?
PLUGINS="$PLUGINS -Premote"
fi
}
case "$1" in
start)
check_vdr
if [ $? == 0 ]; then
echo -n "Attempting to start $SELFNAME "
nohup $SELFPATH up >> $LOG 2>&1 &
echo -n "."
sleep 1
echo -n "."
check_vdr
if [ $? == 0 ]; then
echo " FALSE"
log_failure_msg "something wrong, $SELFNAME has not started"
exit 1
else
echo " OK"
fi
else
log_warning_msg "$SELFNAME already running at PID $VDRPID"
fi
;;
up)
#restore epg.data
if [ -e $VIDEODIR/epg-$VDRCONF.data ]; then
cp $VIDEODIR/epg-$VDRCONF.data /tmp/
fi
#sleep 5 && if [ -x /usr/bin/vdradmind.pl ] ; then /usr/bin/vdradmind.pl ; fi
umask 0002
while (true) do
#reread configuration
if [ -e /etc/$VDRCONF/config/vdr.conf ]; then
. /etc/$VDRCONF/config/vdr.conf
#prepare plugins
parse_plugins
fi
#build vdr command
VDRCMD="$BINDIR/${VDRBIN}${DVBDEV} -L $PLUGINDIR $PLUGINS -v $VIDEODIR -c $CONFDIR -w 30 -E /tmp/epg-$VDRCONF.data"
VDRCMD="$VDRCMD -s $SHUTDOWNSCRIPT $OTHER_OPTS"
echo -n "Starting VDR at: "; date
eval $VDRCMD
RC=$?
echo "RC $RC"
if test $RC -eq 0; then
echo -n "Normal program exec at: " >>$LOG; date >>$LOG
exit $RC
elif test $RC -eq 1; then
echo -n "An error has been detected which requires the DVB driver and vdr to be reloaded at: " >>$LOG; date >>$LOG
elif test $RC -eq 2; then
echo -n "An non-recoverable error has been detected, vdr has given up at: " >>$LOG; date >>$LOG
exit $RC
elif test $RC -eq 137 -o $RC -eq 143; then
echo -n "VDR killed by user at: " >>$LOG; date >>$LOG
exit $RC
else
echo -n "Crash VDR at: " >>$LOG; date >>$LOG
sleep 1
echo "Restarting ...">>$LOG
fi
done
;;
stop)
check_vdr
if [ $? == 0 ]; then
log_warning_msg "$SELFNAME not started"
else
if [ -e /var/run/vdr.pid ]; then
PID=`cat /var/run/vdr.pid`
if [ x"$PID" != "x" ]; then
kill -9 $PID
fi
rm -f /var/run/vdr.pid
#else
#echo "pid file not found"
fi
echo -n "Attempting to kill $SELFNAME "
kill $VDRPID 2>/dev/null
echo -n "."
for ((j=0; $j<10; j=$j+1)); do
sleep 1
KILLDELAY=10
for ((i=0; $i<$KILLDELAY; i=$i+1)); do
check_vdr
if [ $? == 0 ]; then
break
fi
if test $i -lt 7; then
kill $VDRPID 2>/dev/null || break
else
kill -9 $VDRPID 2>/dev/null || break
fi
sleep 1; echo -n "."
done
check_vdr
if [ $? == 0 ]; then
break
fi
echo -n "|" # next attempt
done
echo -n "."
check_vdr
if [ $? == 0 ]; then
echo " OK"
else
kill -9 $VDRPID 2>/dev/null
echo " FALSE"
exit 1
fi
fi
#if [ -x /usr/bin/vdradmind.pl ] ; then /usr/bin/vdradmind.pl -k ; fi
#backup epg.data
if [ -e /tmp/epg-$VDRCONF.data ]; then
cp /tmp/epg-$VDRCONF.data $VIDEODIR
fi
;;
check|status)
check_vdr
if [ $? == 0 ]; then
log_success_msg "$SELFNAME not started"
exit 1
else
log_success_msg "$SELFNAME running at PID $VDRPID"
fi
;;
restart)
check_vdr
if [ $? == 0 ]; then
log_warning_msg "$SELFNAME not started"
else
$SELFPATH stop
fi
$SELFPATH start
;;
*)
echo "Usage: $SELFNAME {start|stop|restart|check|status}" >&2
exit 1
;;
esac
exit 0