Si la respuesta de Ignacio Vázquez-Abrams realmente no funciona para usted, por ejemplo, porque el script necesita una gran cantidad de parámetros o los criterios de invocación no son triviales (o no están sujetos al tiempo), entonces un enfoque alternativo es hacer un simple secuencia de comandos de envoltura, llame a la secuencia de comandos de envoltura a intervalos regulares y haga que la secuencia de comandos de envoltura verifique la hora actual e invoque la secuencia de comandos principal.
Por ejemplo:
#/bin/bash
# Check to see if we should run the script now.
HOUR=$(date +%H)
MINUTE=$(date +%M)
if test $HOUR -lt 9; then exit 0; fi
if test $HOUR -eq 9 -a $MINUTE -lt 30; then exit 0; fi
if test $HOUR -eq 17 -a $MINUTE -gt 30; then exit 0; fi
if test $HOUR -gt 17; then exit 0; fi
# All checks passed; we should run the script now.
exec script.sh ... long list of parameters ...
Esto permite codificar criterios de ejecución más complejos de lo que permite la sintaxis de cron, a un costo relativamente pequeño de invocar regularmente un shell y un script separado.