A script which can run now, or later

It's sometimes useful to write a script which can do something, but you then want to run it at a pre-determined time in the future. My example here is recording live television using, for example, a DVBSky T982 PCIe card.

A command to record from such a card can be pretty trivial:

mplayer dvb://channelname -dumpstream -dumpfile filename.mpg

Turning this into a script which will record for a specified time and then stop is not much more complicated:

#!/bin/bash

# Record something from DVB for a fixed duration
# $1 is the channel to record, $2 is the duration to record for

seconds=`date +%s -d "1970-01-01 $2 +1 hour"`
now=`date +%F_%H%M%S`

mplayer dvb://"$1" -dumpstream -dumpfile ~/DVB/"$1.$now.mpg" &>/dev/null &

sleep 5
mpid=`ps ax | grep "mplayer.*$1.$now.mpg" | grep -v grep | cut -c1-5`

sleep $seconds

echo "Recorded $1.$now.mpg - now going to kill $mpid"
kill -KILL $mpid

You can't tell mplayer to record for a specified time, so you just tell it to start recording and then kill its process ID after the allotted time.

However, you then have to use cron or more likely at to set this script to run when you want to start recording. It would be nice to have the script accept a(n optional) third parameter to tell it when to start recording. If this parameter is present, it sets up an at job to run itself (without the extra parameter) at the specified time. If the parameter is not present, it just starts recording immediately for the specified duration.

#!/bin/bash

# Record something from DVB for a fixed duration
# $1 is the channel to record, $2 is the duration to record for, or:
# $1 is the channel to record, $2 is the date/time to start, $3 is the duration to record for

if [ -z "$2" ]
then
  echo "Please supply both channel name (quoted if it contains spaces) and duration (hh:mm:ss)"
  exit 1
fi

if [ -n "$3" ]
then
# We have a start time as well as a duration, so set up an at job for it
  echo "$0 \"$1\" \"$3\"" | at `date +"%H:%M %F" -d "$2"`
  echo "Recording $1 at `date +\"%T %F\" -d \"$2\"` for `date +%T -d \"$3\"`"
  exit 0
fi

seconds=`date +%s -d "1970-01-01 $2 +1 hour"`
now=`date +%F_%H%M%S`

mplayer dvb://"$1" -dumpstream -dumpfile ~/DVB/"$1.$now.mpg" &>/dev/null &

sleep 5
mpid=`ps ax | grep "mplayer.*$1.$now.mpg" | grep -v grep | cut -c1-5`

sleep $seconds

echo "Recorded $1.$now.mpg - now going to kill $mpid"
kill -KILL $mpid

Go up
Return to main index.