19

I was playing aroudn with some variations of date like

DATE = $(date)

but that didnt work either

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

this just outputs the text as is...

I want to create a log entry in crontab.log with a timestamp on each update

How can I do this on CentOS 6?

UPDATE

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

rendered only [CRON] and NOTHING when I tried it =/

qodeninja
  • 2,803

3 Answers3

38

Cron is not a shell - it does not parse commands in the same way that a shell does. As such, your variable is assigned as if it was static text.

There are three solutions I know of to this problem:

Option 1: Use a shell script to generate your command, include whatever variables and logic you want - and call that shell script from cron.

* * * * * /path/to/myscript.sh

Where myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

Option 2: Include the date command directly in your command, and, since the entire command is passed to the shell, the date will be processed and replaced with an actual date.

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

Option 3: Set the string variable in cron, and pass that to your command to be processed (note - the percent signs do not need to be escaped, and the variable itself is wrapped in $() to execute it in a separate shell - backticks should work the same):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(In all the cases above, you can, of course, use a variable for the log path, instead of 'hard coding' it.)

Pablo A
  • 210
cyberx86
  • 21,105
1

The "problem" is that cron uses the percent sign as a special character. You have to quote it so it is ignored by cron, but not by the shell. Like most of the folks who I saw that spent hours upon hours tinkering around with when and how and where to quote what, I went through that hack-and-slash as well.

Here's the solution I found that has worked on all flavors of *nix:

# Define the percent sign in a variable.
P=%
#
# Now use it in a $() subshell. Don't get freaked about the double quotes
# inside the $(), they are processed by the subshell.
57 2 * * * root /bin/echo "[CRON] at $(date "+${P}d-${P}b${P}Y")" 1>>/tmp/crontab.log 2>&1

As the old saying in the world of Perl: there is always more than one way to do it. I am not saying this is the only way or the best way -- what I am saying is that this works for crontab entries running on CentOS, Debian, Ubuntu, Mac, and AIX, so this is what am sticking with.

kenlukas
  • 3,404
0

Just a working example of using variables in the crontab file and their substitution in the strings:

CURRENT_TIME=date +%Y.%m.%d_%H:%M:%S.%3N
CURRENT_DATE=date +%Y_%m_%d

SIMPLE_VAR=the_simple_var LOG_DIR=/var/log/cron

          • /bin/echo "simple variable test! ${SIMPLE_VAR}__test!" >> "${LOG_DIR}/test.log"
          • /bin/echo "complex variable test! $(${CURRENT_TIME})__test!" >> "${LOG_DIR}/test.log"