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. -------------- next part -------------- #!/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 -------------- next part -------------- #!/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 -------------- next part -------------- # /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 -------------- next part -------------- #! /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