14

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 =/

31

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

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.)

5
  • 1
    thanks for the great feedback +1, i tried to add it to the crontab but doing that didnt work =/ it never renders DATEVAR – qodeninja Dec 11 '11 at 1:50
  • I just did this on a RHEL/CentOS6 compatible system and it gave the expected result (i.e. added a new line to the file with the date). Which option (of the 3 above) did you try, and what was the result - be specific - and was there an error in /var/log/cron? (if you use the script option, a) don't forget to chmod +x and b) try it on its own first (i.e. not through cron)) – cyberx86 Dec 11 '11 at 1:53
  • 1
    option 3 =], I had tried to do that before but it didnt render. But now im noticing you did something a lil dif. why did you double up the $($(DATE))? see my update above – qodeninja Dec 11 '11 at 1:57
  • 1
    You have a typo in the update you added - it is $($DATEVAR) not $($(DATEVAR)). Think of it this way - $() - that is, the outer bracket - launches a new shell to process whatever is in the brackets. In this case, the variable $DATEVAR is set to a string and is passed to the shell. $(DATEVAR) is nothing - because DATEVAR is nothing (i.e. is it missing a $ to identify it as a variable). You could also use backticks around $DATEVAR to get the same result – cyberx86 Dec 11 '11 at 2:01
  • fair enough. updated it. lets try this bad boy! -- Hazaaah! it worked lol – qodeninja Dec 11 '11 at 2:02
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.

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"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.