Is there a command line switch that would allow me to define a command vdr must excute after initial startup? I see one for before and after recordings, but I am looking for a way to execute a command after startup only.
Best Regards.
Just add option "-r script.sh"
#!/bin/sh case "$1" in before) ;; after) echo "After recording $2" /usr/local/bin/startnoad.sh "$2" & ;; edited) echo "Edited recording $2" ;; *) echo "ERROR: unknown state: $1" ;; esac
-----Ursprüngliche Nachricht----- Von: vdr-bounces@linuxtv.org [mailto:vdr-bounces@linuxtv.org] Im Auftrag von C.Y.M Gesendet: Dienstag, 5. September 2006 15:15 An: Vdr Betreff: [vdr] execute command after vdr starts
Is there a command line switch that would allow me to define a command vdr must excute after initial startup? I see one for before and after recordings, but I am looking for a way to execute a command after startup only.
Best Regards.
_______________________________________________ vdr mailing list vdr@linuxtv.org http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
martin wrote:
Just add option "-r script.sh"
#!/bin/sh case "$1" in before) ;; after) echo "After recording $2" /usr/local/bin/startnoad.sh "$2" & ;; edited) echo "Edited recording $2" ;; *) echo "ERROR: unknown state: $1" ;; esac
Thanks for your replay, but I was looking for a switch that would make vdr run a script right after vdr starts up. Can this be adopted to that? This seems to only work after a recording has occurred.
Best Regards.
C.Y.M wrote:
Thanks for your replay, but I was looking for a switch that would make vdr run a script right after vdr starts up.
If you want to start a program together with VDR, why don't you put it into your runvdr script?
Cheers,
Udo
Udo Richter wrote:
C.Y.M wrote:
Thanks for your replay, but I was looking for a switch that would make vdr run a script right after vdr starts up.
If you want to start a program together with VDR, why don't you put it into your runvdr script?
Because in the runvdr script, the vdr command is executed by an "eval" statement which basically waits for the process to die before it continues on.
eval "$VDRCMD" if test $? -eq 0 -o $? -eq 2; then exit; fi echo "`date` Reloading DVB drivers" ...
This is how the script makes vdr will restart automatically when it crashes. I'm looking for a way to have vdr execute the command so I dont have to guess with sleep statements.
BR.
C.Y.M wrote:
Because in the runvdr script, the vdr command is executed by an "eval" statement which basically waits for the process to die before it continues on.
This could be avoided by backgrounding VDR, do other stuff, and then 'wait' for VDR to terminante. 'wait $PID' will even return the error level of VDR.
This is how the script makes vdr will restart automatically when it crashes. I'm looking for a way to have vdr execute the command so I dont have to guess with sleep statements.
So you actually want to start your process some time *after* VDR started up, so that VDR has initialized some stuff. So for what are you waiting actually? Reading configuration? Loading plugins? Starting pending timers? Updating EPG?
Cheers,
Udo
Udo Richter wrote:
C.Y.M wrote:
Because in the runvdr script, the vdr command is executed by an "eval" statement which basically waits for the process to die before it continues on.
This could be avoided by backgrounding VDR, do other stuff, and then 'wait' for VDR to terminante. 'wait $PID' will even return the error level of VDR.
Yes, I like the idea of backgrounding VDR using "&" and then using 'wait $PID'. Is that the method you use? I've been trying to find the best way to do this. Could you give me an example? :)
This is how the script makes vdr will restart automatically when it crashes. I'm looking for a way to have vdr execute the command so I dont have to guess with sleep statements.
So you actually want to start your process some time *after* VDR started up, so that VDR has initialized some stuff. So for what are you waiting actually? Reading configuration? Loading plugins? Starting pending timers? Updating EPG?
For now, I'm just trying to send a MESG via svdrpsend.pl to VDR so it displays a welcome message after starting up and initializing its plugins. But, I might also want VDR to send me an email when it restarts. Its hard to time it properly if I call runvdr with an init.d script and send runvdr in the background. Since runvdr will load the drivers, call up a startup video, then wait for vdr to initialize all its plugins before trying to send a welcome message to the OSD via svdrpsend. The idea of 'wait $PID' sounds good, but there would still need to be a sleep after starting vdr as a background process (since plugins must initialize).
Best Regards.
C.Y.M wrote:
Yes, I like the idea of backgrounding VDR using "&" and then using 'wait $PID'. Is that the method you use? I've been trying to find the best way to do this. Could you give me an example? :)
Something like that. This is a snippet of my overgrown runvdr script:
# Run VDR eval "$VDRCMD &"
# Remember PID of VDR process PID=$!
# Wait for VDR to end or signal to arrive wait $PID
# Remember return value of VDR RET=$?
The reason I do it this way is that I also handle some signals sent to runvdr, to terminate or restart on demand. If you want to start something in parallel, its probably no big difference whether you start your script before or after VDR, as long as you background it. You can background within a script like this:
{ sleep 1s echo -n world } & echo -n "hello " sleep 2s echo .
For now, I'm just trying to send a MESG via svdrpsend.pl to VDR so it displays a welcome message after starting up and initializing its plugins.
You can wait for the SVDRP socket to accept connections, that would be one way to wait for a mainly running VDR.
Cheers,
Udo
Udo Richter wrote:
C.Y.M wrote:
Yes, I like the idea of backgrounding VDR using "&" and then using 'wait $PID'. Is that the method you use? I've been trying to find the best way to do this. Could you give me an example? :)
Something like that. This is a snippet of my overgrown runvdr script:
# Run VDR eval "$VDRCMD &"
# Remember PID of VDR process PID=$!
# Wait for VDR to end or signal to arrive wait $PID
# Remember return value of VDR RET=$?
The reason I do it this way is that I also handle some signals sent to runvdr, to terminate or restart on demand. If you want to start something in parallel, its probably no big difference whether you start your script before or after VDR, as long as you background it. You can background within a script like this:
{ sleep 1s echo -n world } & echo -n "hello " sleep 2s echo .
For now, I'm just trying to send a MESG via svdrpsend.pl to VDR so it displays a welcome message after starting up and initializing its plugins.
You can wait for the SVDRP socket to accept connections, that would be one way to wait for a mainly running VDR.
Thanks a lot Udo. Those examples really helped. Here is what I have done...
BR.
#!/bin/sh # insmod modules from current directory without having to install them first # KERNELVER=`uname -r` # KERNELDIR="/lib/modules/$KERNELVER/misc"
sync
function DriverLoaded() { grep -qse dvb[-_]core /proc/modules }
DEVTIMEOUT=10 LOOP=0 case "$1" in load) if ! DriverLoaded; then echo -e "Inserting DVB modules into kernel. \n" # STARTTIME=$(date +%s) # av7110 based "full featured" cards modprobe stv0299 # saa7146 based siemens/technotrend/hauppauge cards modprobe dvb-ttpci # wait for udev to create the devices before continuing until [ -e /dev/dvb/adapter0/video0 ] || [ $LOOP -eq $DEVTIMEOUT ] ; do sleep 1 LOOP=$((LOOP+1)) done if [ $LOOP -eq $DEVTIMEOUT ]; then echo -e "Creation of /dev/dvb/adapter0/video0 has timed out in $DEVTIMEOUT seconds. Check UDEV or rebuild drivers. \n" exit 1 fi # FINISHTIME=$(date +%s) # RESULTTIME=$((FINISHTIME - STARTTIME)) # echo -e "DVB device created in $RESULTTIME second(s). \n" if [ -e "/usr/local/bin/loadkeys/av7110_loadkeys" ]; then /usr/local/bin/loadkeys/av7110_loadkeys /usr/local/bin/loadkeys/hauppauge_grey.rc5 > /proc/av7110_ir sleep 1 fi else echo -e "DVB Drivers already loaded. \n" fi ;; debug) if ! DriverLoaded; then echo -e "Inserting DVB modules (debug) into kernel. \n" # STARTTIME=$(date +%s) # av7110 based "full featured" cards modprobe stv0299 debug_switch_timing=1 # saa7146 based siemens/technotrend/hauppauge cards modprobe dvb-ttpci debug=247 until [ -e /dev/dvb/adapter0/video0 ] || [ $LOOP -eq $DEVTIMEOUT ] ; do sleep 1 LOOP=$((LOOP+1)) done if [ $LOOP -eq $DEVTIMEOUT ]; then echo -e "Creation of /dev/dvb/adapter0/video0 has timed out in $DEVTIMEOUT seconds. Check UDEV or rebuild drivers. \n" exit 1 fi # FINISHTIME=$(date +%s) # RESULTTIME=$((FINISHTIME - STARTTIME)) # echo -e "DVB device created in $RESULTTIME second(s). \n" if [ -e "/usr/local/bin/loadkeys/av7110_loadkeys" ]; then /usr/local/bin/loadkeys/av7110_loadkeys /usr/local/bin/loadkeys/hauppauge_grey.rc5 > /proc/av7110_ir sleep 1 fi else echo -e "DVB Drivers already loaded. \n" fi ;; unload) if DriverLoaded; then echo -e "Removing DVB modules from kernel. \n" rmmod ves1x93 dvb_ttpci saa7146_vv video_buf saa7146 videodev v4l1_compat \ v4l2_common ttpci_eeprom stv0299 dvb_core echo else echo -e "DVB Drivers not loaded. \n" fi ;; reload) $0 unload && $0 load ;; *) echo "Usage$0 {load|unload|debug|reload}" exit 1 esac
sync
#!/bin/sh
# runvdr: Loads the DVB driver and runs VDR # # If VDR exits abnormally, the driver will be reloaded # and VDR restarted. # # In order to actually use this script you need to implement # the functions DriverLoaded(), LoadDriver() and UnloadDriver() # and maybe adjust the VDRPRG and VDRCMD to your particular # requirements. # # Since this script loads the DVB driver, it must be started # as user 'root'. Add the option "-u username" to run VDR # under the given user name. # # Any command line parameters will be passed on to the # actual 'vdr' program. # # See the main source file 'vdr.c' for copyright information and # how to reach the author. # # $Id: runvdr 1.19 2006/05/14 16:02:05 kls Exp $
## Start Configuration Section ##
# Disable NPTL (recommended) export LD_ASSUME_KERNEL=2.4.1 #export LD_ASSUME_KERNEL=2.4.19
# Uncomment to disable UTF-8 within VDR #export LANG=en_US #export LC_CTYPE=iso_8859_1
PLUGINS="-Premote -Pscreenshot -Pepgsearch -Pprefermenu -Pdvdselect -Pvcd -Pfemon -Ptaste -Pstreamdev-server -Pstreamplayer -Ptext2skin -Pyaepg -Pundelete -Pweatherng -Posdpip -Pmplayercluster -Peggtimer -Psysinfo -Pradioinfo -P'mp3 -C /etc/vdr -m /etc/vdr/plugins/mount.sh -i /etc/vdr/plugins/image_convert.sh -c /etc/vdr/images' -P'dvd -C/dev/cdrom' -P'mplayer -M /etc/vdr/plugins/mplayer.sh -m /etc/vdr/plugins/mount.sh' -P'xine -r -X 720 -Y 480'"
# VDR Recording directory (default is usually /video) VIDEO_DIR="/video" # VDR Configuration directory where setup.conf lives CFG_DIR="/etc/vdr" # Where the VDR epg.data file lives EPG_DIR="/etc/vdr" # Search path for VDR plugins PLUG_DIR="/usr/local/bin/PLUGINS/lib" # Startup Options passed to VDR OPTIONS="--terminal=/dev/tty8 -l 3 -w 0 --grab=/tmp" # Path to VDR binary VDRPRG="/usr/local/bin/vdr" # Path to insdvb.sh (for loading dvb modules) INSDVB="/usr/local/bin/insdvb.sh" # Path to svdrpsend.pl SVDRP="/usr/local/bin/svdrpsend.pl" # Path to mplayer MPLAY="/usr/bin/mplayer" # Path to startup video VIDEO="/etc/vdr/VDRboot-NTSC.mpeg" # Number of times runvdr will attempt to restart vdr after a crash has occured (set to 0 for no limit) MAXTRIES=10 # Minimum runtime required (in seconds) for vdr to continue restart attempts MINRUN=20
## End Configuration Section ##
if [ ! -e "/lib/modules/`uname -r`/kernel/drivers/media/video/videodev.ko" ]; then echo -e "ERROR: No DVB kernel modules detected. VDR will not attempt to start. \n" exit 0 fi
if [ ! -e "${INSDVB}" ]; then echo -e "ERROR: ${INSDVB} was not detected. Exiting. \n" exit 0 fi
if [ ! -e "${SVDRP}" ]; then echo -e "ERROR: ${SVDRP} was not detected. Exiting. \n" exit 0 fi
VDRCMD="$VDRPRG -v $VIDEO_DIR -E $EPG_DIR -c $CFG_DIR -L $PLUG_DIR $OPTIONS $PLUGINS" KILL="/usr/bin/killall -q -TERM"
# Detect whether the DVB driver is already loaded # and return 0 if it *is* loaded, 1 if not: function DriverLoaded() { grep -qse dvb[-_]core /proc/modules }
# Load all DVB driver modules needed for your hardware: function LoadDriver() { ${INSDVB} load if [ -e "${MPLAY}" ] && [ -e "${VIDEO}" ] ; then ${MPLAY} -frames 145 -vo mpegpes -ao mpegpes ${VIDEO} 2>/dev/null 1>/dev/null fi }
# Unload all DVB driver modules loaded in LoadDriver(): function UnloadDriver() { ${INSDVB} unload }
# Load driver if it hasn't been loaded already: if ! DriverLoaded; then LoadDriver fi
LASTRESTART=$(date +%s) LOOPCOUNT=0 while (true) do if [ $LOOPCOUNT -le $MAXTRIES ] || [ $MAXTRIES -eq 0 ] ; then eval "$VDRCMD &" # Wait for VDR to initialize then do rest sleep 10 ${SVDRP} -d localhost "MESG VDR Startup Sequence Completed" 2>/dev/null 1>/dev/null touch /tmp/VDRBOOT_COMPLETE else $KILL runvdr fi # Remember PID of VDR process PID=$! # Wait for VDR to end or signal to arrive wait $PID # Remember return value of VDR RET=$? if test $RET -eq 0 -o $RET -eq 2; then exit; fi TIMEOFDEATH=$(date +%s) RUNTIME=$((TIMEOFDEATH - LASTRESTART)) if [ $TIMEOFDEATH -le $(($LASTRESTART + $MINRUN)) ] ; then echo "`date` VDR crashed in $RUNTIME seconds. Minimum required runtime for VDR is $MINRUN seconds. Killing runvdr process..." $KILL runvdr fi echo "`date` Reloading DVB drivers" $KILL vdr sleep 10 UnloadDriver LoadDriver LASTRESTART=$(date +%s) LOOPCOUNT=$((LOOPCOUNT+1)) echo "`date` Restarting VDR $LOOPCOUNT time(s). Maximum retries set to $MAXTRIES" done
# /etc/default/vdrc # Default VDR startup config
# Change to 1 to enable vdr's init-script ENABLED=1
# Location of svdrpsend.pl SVDRP="/usr/local/bin/svdrpsend.pl"
# Location of module loading script INSDVB="/usr/local/bin/insdvb.sh"
# DVB Device creation timeout (in seconds) TIMEOUT=45
#! /bin/sh # # vdr start-stop script #
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin NAME="runvdr" DESC="VDR - Linux Video Disk Recorder" DAEMON="vdr"
ENABLED=0 test -f /etc/default/vdrc && . /etc/default/vdrc test "$ENABLED" != "0" || exit 0
rm -f /tmp/VDRBOOT_COMPLETE
if [ ! -e "/lib/modules/`uname -r`/kernel/drivers/media/video/videodev.ko" ]; then echo -e "ERROR: No DVB kernel modules detected. VDR will not attempt to start. \n" exit 0 fi
LOOP=0 case "$1" in start) if ! ps -C vdr > /dev/null 2>&1; then echo -e "Starting $DESC: $NAME. \n" runvdr & until [ -e /tmp/VDRBOOT_COMPLETE ] || [ $LOOP -eq $TIMEOUT ] ; do sleep 1 LOOP=$((LOOP+1)) done if [ $LOOP -eq $TIMEOUT ]; then echo -e "VDR startup sequence has timed out in $TIMEOUT seconds. VDR will not start. \n" exit 1 fi echo -e "VDR startup time was $LOOP second(s). \n" echo -e "VDR startup sequence completed. \n" else echo -e "VDR is already running..\n" fi ;; stop) if ps -C vdr > /dev/null 2>&1; then echo -e "Stopping $DESC: $NAME. \n" ${SVDRP} -d localhost "MESG VDR Shutdown Sequence Initialized" 2>/dev/null 1>/dev/null sleep 3 killall -q -TERM $NAME killall -q -TERM $DAEMON sleep 5 ${INSDVB} unload else echo -e "VDR is not running. \n" fi ;; restart|force-reload) if ps -C vdr > /dev/null 2>&1; then echo -e "Restarting $DESC: $NAME. \n" ${SVDRP} -d localhost "MESG VDR Restart Sequence Initialized" 2>/dev/null 1>/dev/null sleep 3 killall -q -TERM $NAME killall -q -TERM $DAEMON sleep 5 ${INSDVB} unload sleep 2 runvdr & until [ -e /tmp/VDRBOOT_COMPLETE ] || [ $LOOP -eq $TIMEOUT ] ; do sleep 1 LOOP=$((LOOP+1)) done if [ $LOOP -eq $TIMEOUT ]; then echo -e "VDR startup sequence has timed out in $TIMEOUT seconds. VDR will not start. \n" exit 1 fi echo -e "VDR startup time was $LOOP second(s). \n" echo -e "VDR startup sequence completed. \n" else echo -e "VDR is not running. \n" fi ;; *) N=/etc/init.d/$NAME echo "Use: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac
rm -f /tmp/VDRBOOT_COMPLETE
exit 0