How can I execute `date` inside of a cron tab job?

166,404

Solution 1

Short answer:

Escape the % as \%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

Long answer:

The error message suggests that the shell which executes your command doesn't see the second back tick character:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

This is also confirmed by the second error message your received when you tried one of the other answers:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

The crontab manpage confirms that the command is read only up to the first unescaped % sign:

The "sixth" field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

Solution 2

If you would like to make the date formatting string as a variable (to avoid duplicating the whole string), DO NOT escape % and DO NOT put it in $()

For example, while declare the string, just write:

DATEVAR="date +%Y%m%d_%H%M%S"

Then, write cron statement with $($VARIABLE_NAME) like this:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Thanks to cyberx86, her/his answer at ServerFault might be more completed:

Solution 3

You can also put your commands into a shell file and then execute the shell file with cron.

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

cron

0 * * * * sh jobs.sh

Solution 4

In cron, you can use this simple syntax:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

Solution 5

A basic solution:

  • use $() for executing date command and return output
  • format datetime to UTC, escape the % character with \
  • add 2>&1 at the end for streaming both stdout and stderr into that log file

Example:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

Output:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
Share:
166,404
cwd
Author by

cwd

Updated on September 18, 2022

Comments

  • cwd
    cwd almost 2 years

    I want to create a log file for a cron script that has the current hour in the log file name. This is the command I tried to use:

    0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
    

    Unfortunately I get this message when that runs:

    /bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
    /bin/sh: -c: line 1: syntax error: unexpected end of file
    

    I have tried escaping the date part in various ways, but without much luck. Is it possible to make this happen in-line in a crontab file or do I need to create a shell script to do this?

    • Sridhar Sarnobat
      Sridhar Sarnobat over 4 years
      I wasted an hour of my life before googling for this! It never occurred to me that anything needed escaping.
  • Tebe
    Tebe about 9 years
    Sorry for my ignorance, but where do you see this error messages? When I do 'grep CRON /var/log/syslog' I see no error messages, although cron failed - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
  • Jasen
    Jasen over 8 years
    @Копать_Шо_я_нашел cron will send an email with the error message,
  • DevilCode
    DevilCode about 8 years
    date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
  • bala4rtraining
    bala4rtraining over 6 years
    Output date format will retrun like cron_20180123.log
  • G-Man Says 'Reinstate Monica'
    G-Man Says 'Reinstate Monica' over 5 years
    (1) What are you saying that hasn’t already been said by the accepted answer?   (2) Your answer is much more complicated than the question.  For example, you added the -d option, which is not used in the question (and you did not explain it).  How do you justify calling this “simple syntax”?
  • G-Man Says 'Reinstate Monica'
    G-Man Says 'Reinstate Monica' over 5 years
    What are you saying that hasn’t already been said by the accepted answer? Are you saying that it works better without quotes than it does with quotes? (Hint: that’s very unlikely.)
  • Manuel Schmitzberger
    Manuel Schmitzberger over 5 years
    The accepted answer simply doesn't work for me. This one does.
  • Frank Fang
    Frank Fang almost 5 years
    DATEVAR="date +%Y%m%d_%H%M%S"
  • Kusalananda
    Kusalananda over 3 years
    This answer has issues with quoting, and it's unclear where to set the DATEVAR variable and how to do it in such a way that it support e.g. format string containing spaces.
  • Martian2020
    Martian2020 over 2 years
    @Tebe he sees them in the question. if not clear better be comment to the question. My guess that errors are seen in that file because the job is echo hello >> file
  • Admin
    Admin about 2 years
    Why did they implement this behaviour for the percent sign?
  • Admin
    Admin about 2 years
    Quoting is fixed. You put the definition in the head of your crontab file
  • Admin
    Admin about 2 years
    Be careful with names containing period. Better use underscore jobs_sh
  • Admin
    Admin about 2 years
    @rubo77 what concern do you see with a filename containing a period?