LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - General (http://www.linuxquestions.org/questions/linux-general-1/)
-   -   cron - finding last day of month (http://www.linuxquestions.org/questions/linux-general-1/cron-finding-last-day-of-month-662702/)

FormalLogic 08-14-2008 04:19 AM

cron - finding last day of month
 
Hi guys,
I want to know how to run a task at the last day of every month, whethwer it has 31, 30 days or whatever. it's to update a MySql db (The Worst Database In The World, no contest :)

Thanks in advance.
I'll include a cron header to make it easy to explain.

#minute (0-59),
#| hour (0-23),
#| | day of the month (1-31),
#| | | month of the year (1-12),
#| | | | day of the week (0-6 with 0=Sunday).
#| | | | | commands
#------------------------------------------------------------------------------

matthewg42 08-14-2008 05:05 AM

Run a script on the 28-31 day of the month, and have a test inside your script.

matthewg42 08-14-2008 05:18 AM

For example, make a script called "is_last_day_of_month" containing this:
Code:

#!/bin/bash

if [ $# -eq 0 ]; then
        test_date=$(date)
else
        test_date="$1"
fi

today_month=$(date -d "$test_date" +%m)
tomorrow_month=$(date -d "$test_date + 1 day" +%m)

[ "$today_month" != "$tomorrow_month" ] && exit 0 || exit 1

Save it somewhere, e.g. /usr/local/bin/is_last_day_of_month and make it executable. Then in your crontab (to run at 1:13 am):

Code:

13 1 28-31 * * /usr/local/bin/is_last_day_of_month && yourcommand

colucix 08-14-2008 10:01 AM

Another idea is a test based on the cal command, as shown in this thread.

FormalLogic 08-15-2008 01:42 AM

Thanks Guys!!!
 
Thanks guys, answer is perfect,
This thread just shows how much I still need to learn. i'm a sysadmin/programmer so I'm learning different date syntax all the time (i've got to remember MySql/Php/Linux/C/God Knows What else) It's a little daunting sometimes. But I'll just do what i always do: wing it! As you've probably guessed formal logic is a euphamisim for "Don't know what the hell i'm doing"

colucix 08-15-2008 03:15 AM

I've just noticed a little bug in the code suggested by matthewg42. In line 10:
Code:

tomorrow_month=$(date -d "$test_date + 1 day" +%m)
you have to strip out the plus sign between $test_date and "1 day". The syntax to add days, hours, and so on, is simply
Code:

date -d "$test_date 1 day 3 hours"
that is you can put one or more time specifications with different units, but without the + sign. To subtract an amount of time, use the word "ago" in the time specification:
Code:

date -d "$test_date 4 days ago"

archtoad6 12-08-2008 07:05 AM

Messy.

I've just re-read man:crontab(5) & man:cron(8) & I'm surprised there is no "Last of Month" feature. IMO, this is a bug.

If you run your script at 1:13 am, as suggested, won't you be doing your update before the beginning of business? I would expect that anything that needs to be done on the last day of the month needs to be done after the close of business. If that is the case, why not run your script at 1:13 am on the 1st of the month.

BTW, what is the purpose of the db update you're tasked w/ doing?


Edit: Oops, I got here from http://www.linuxquestions.org/questi...ly-job-689037/ & forgot that this thread is a little old, hope it doesn't bother anyone.

malaprop 03-10-2009 01:16 PM

This also works, notice here I'm using d/m/y instead of m/d/y.

Code:

# GET FIRST DAY OF LAST MONTH
FIRST=$(date --date "last month" +01/%m/%Y)

# USE FIRST DAY OF THIS MONTH TO GET LAST DAY OF LAST MONTH.
LAST=$(date --date "`date +%m/01/%Y` yesterday" +%d/%m/%Y)

echo "FIRST $FIRST"
echo "LAST $LAST"



All times are GMT -5. The time now is 06:04 AM.