Masterable
  • Blog
  • Photos

Crontab error: unexpected EOF while looking for matching ..., caused by percent signs (%)

2/8/2012

0 Comments

 

Today, I was trying to add a cron job for mysql database backup using crontab -e, everything went well when I tried the command at console, (backup local MySQL database into a folder and removes older then 5 days backups, I got it from commandlinefu.com:)
mysqldump -uroot -ppassword  --all-databases | gzip > /var/www/nginx-default/mysql-backup/mysql-backup-`date +%Y-%m-%d`.sql.gz ;find /var/www/nginx-default/mysql-backup/* -mtime +5 -exec rm {} \; 

but when I did: 
# export EDITOR=vi  
# crontab -e
# m h  dom mon dow   command
MAILTO=zhangyong@gmail.com
 48 3  *   *   * mysqldump -uroot -ppassword  --all-databases | gzip > /var/www/nginx-default/mysql-backup/mysql-backup-`date +%Y-%m-%d`.sql.gz ;find /var/www/nginx-default/mysql-backup/* -mtime +5 -exec rm {} \;

It failed, then I tried replace the backticks with $( )
mysqldump -uroot -ppassword  --all-databases | gzip > /var/www/nginx-default/mysql-backup/mysql-backup-$(date +%Y-%m-%d).sql.gz ;find /var/www/nginx-default/mysql-backup/* -mtime +5 -exec rm {} \; 

failed still, after a few googling I find out in a blog post comment of Anonymous:
You CAN use a backtick operator in the command argument place in a crontab.

However, percent signs (%) in the command must be escaped with a backslash or else they will be interpreted as a newline.

From 'man crontab':
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 crontab file.
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. There is no way to split a single command line onto multiple lines, like the shell?s trailing "\".

so the following is valid:

15 3 * * 0,2-6 echo ´date +\%a´

and

15 3 * * 0,2-6 echo $(date +\%a)

Failure to escape the backslash will result in a cron error:

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


so, the correct command to use in crontab -e is:

 48 3  *   *   * mysqldump -uroot -ppassword  --all-databases | gzip > /var/www/nginx-default/mysql-backup/mysql-backup-$(date +\%Y-\%m-\%d).sql.gz ;find /var/www/nginx-default/mysql-backup/* -mtime +5 -exec rm {} \;
0 Comments

    Author

    Yong Zhang
    Life is short, learn more.

    Archives

    January 2013
    November 2012
    February 2012
    November 2011
    June 2011
    December 2010

    Categories

    All
    Bash
    Excel
    Limesurvey
    Notes
    Tips

    RSS Feed

Powered by Create your own unique website with customizable templates.