I'm looking for a way to run a backup in the cron every Friday, except every 4th Friday (as we do monthly backups then).
The monthly backups are not the 4th Friday of each month, but every 4th Friday (i.e. we don't want this backup to run on x Friday, then the Friday 4weeks/28days later).
This backup also runs Monday-Thursday getting called normally from the cron, but currently it is run manually on Fridays due to this. I understand we will need another script with validation, and call the normal backup script, then put that in the cron - but unsure how to do it.
Thanks for the reply, although it may not necessarily be the 4th Friday we do our monthly backups. It's every 4 weeks. A good example of this would be in April 2011. Our monthly backups would be on Friday 1st April, and Friday 29th April.
Maybe you can use this in a script calling the backup procedure
OFFSET=0 # put any value between 0 and 3 to fix the date of the monthly backup
if (( ( $(date +%U | sed 's/^[0]*//') + OFFSET ) % 4 )) # spaces just for better readability
then
# weekly backup
else
# monthly backup
fi
Thanks! Although a monthly backup may take place on say the 1st. It's not necessarily the last Friday of the month. I'm not really sure how I can write this down clearly. There is an example in post 3 ^
If I understand your code that will run it the first, second and third Friday, but not the fourth of each month, whereas we require it to run on every fourth week.
I was thinking along the lines of using an initial date, then +28 days (multiple). Since there is no set date as such the monthly backups take place, its every four weeks. So we could start the cycle in the script on whatever date. For example, I know our next monthly backups begin on Friday 30th April 2010. Here is a few dates after this to try and give more of an idea of the cycle -
30th April (Just happens to be the last Friday)
28th May (Just happens to be the last Friday)
25th June (Just happens to be the last Friday)
23rd July (Not the last Friday, it's in fact the 4th out of 5 Fridays in July)
20th August (Not the last Friday either, it's the 3rd out of 4)
The reason it is set a little odd like this is because it's the weekend after our pay (we get paid 4 weekly, not monthly).
Hope this makes sense.
Thanks for the replies!
Rab
Edit - Poor attempt at pseudo like code below
Cron Entry - 00 21 * * 5 /backupscript
backupscript -
if todays date is +28 (multiple) 30th April
then run monthly backup
else run normal backup
fi
There is probably a better way to do it, I don't know enough about scripting to get my head around it
Edit 2 - This is AIX v5.3 if it makes any difference.
Any solution will need to know when the last monthly backup ran or when the next monthly backup is scheduled to run, perhaps by having that info stored in a file by the monthly backup process. With that info in hand, it should be easy enough for the daily to decide if it should run on any given friday.
I'll give it a try with some overly commented code.
Oh. And run it as a cron job every friday.
#!/bin/bash
# name of file to keep track of last backup
lastbackup=./lastbackup
if [ -f $lastbackup ]
then
# Time of last backup (seconds since epoch)
timelast=$(stat -c %Y $lastbackup)
# Current time (seconds since epoch)
timenow=$(date +%s)
# 86400 sec per day. 28 days is four weeks
fourweeks=$(( 86400 * 28 ))
# slacktime = Some slack so we survive bad clock
# and daylight saving time. (2h)
slacktime=$(( 3600 * 2 ))
# Have more than four weeks passed? (minus 2h)
timepassed=$(( $timenow - $timelast ))
fourweeksslack=$(( $fourweeks - $slacktime))
if [ $timepassed -gt $fourweeksslack ]
then
echo BackupBackupBackup
else
echo NoBackup
fi
else
# Should only occur first time script is run
echo $lastbackup was created
touch $lastbackup
fi