Cron is a very basic scheduler without any real conveniences such as retries, so you'll need to get creative.
My first thought is to schedule the script at both times (2pm and 3pm for instance) and have the first script delete, or move, the input file. The second execution will fail because the first execution processed the file, and if the file wasn't there for the first execution, the second should find it. If the script is already deleting/moving the file, then no changes will be needed.
If you need to keep the file, another simple solution would be to have the script sleep for an hour and retry if it doesn't find the file initially. Depending on the complexity of your script this will require the least amount of change to your script.
The only other way that I can think of is a bit of a kludge, and will require a few modifications to your script, but it will work.
First, modify your script to create a 'rerun' file in /tmp or some other known location when it is not able to find the file that it needs. It then exits.
A second modification, to accept a check option from the command line is also necessary. If the check option is present, then the script should initially test for the 'rerun' file. If the rerun file isn't present, then the script should immediately exit. The fact that there is no rerun file indicates that the earlier execution was successful.
Once those changes are made, add two more lines to your crontab that invoke the script at 3pm and 3am with the check option.
A small (untested) example of this (ksh/bash Im not a Csh person at all):
#!/usr/bin/env ksh
create_rerun=1 # default to creating rerun on failure
if [[ $1 == -c ]]
then
if [[ ! -f /tmp/my.rerun ]]
then
echo "did not find rerun file; exiting OK"
exit 0
fi
create_rerun=0 # don't create a rerun on failure
fi
rm -f /tmp/my.rerun # ensure that the rerun file is gone
if [[ ! -f needed_file_name ]]
then
echo "unable to find needed file"
if (( $create_rerun > 0 ))
then
touch /tmp/my.rerun
exit 0 # stop now, an ok return code
fi
exit 1 # stop now -- error
fi
# what ever code you have to manipulate the file
If the script cannot be modified, then create a small 'wrapper' that is basically the code above and invoke the wrapper from cron. The wrapper then invokes the real script, but only if the file exists.
The crontab entries would be something like this for the check method:
0 2 * * * /usr/home/me/bin/myscript
0 3 * * * /usr/home/me/bin/myscript -c