我在运行 cron 作业以导出 Godaddy 共享托管 Cpanel 帐户上的所有数据库时遇到问题。但我很难找到下面命令中的语法错误。
相同的命令正在我的 AWS Ec2 上运行。
mysql -N -ubackup -pt -e 'show databases' | while read dbname; do mysqldump -ubackup -p123 --complete-insert -N "$dbname" > /home/test/sqlbackups/'$(date +"%Y-%m-%d")-$dbname'.sql;done
邮件收到错误:
/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
/bin/bash: -c: line 1: syntax error: unexpected end of file
答案1
Crontab 命令会将所有未转义的出现%
替换为换行符。这是来自手册crontab(5)
在我的系统上:
命令字段(该行的其余部分)是要运行的命令。该行的整个命令部分(直到换行符或字符)将由crontab 变量 中指定的 shell
%
执行。/bin/sh
SHELL
命令中的百分号 (%
) 除非用反斜杠 (\
) 转义,否则将更改为换行符,并且第一个之后的所有数据%
都将作为标准输入发送到命令。
你的 crontab 命令应该是这样的
mysql -N -ubackup -pt -e 'show databases' | while read dbname; do mysqldump -ubackup -p123 --complete-insert -N "$dbname" > /home/test/sqlbackups/"$(date +"\%Y-\%m-\%d")-$dbname".sql;done
在这里,我还更正了$(...)
之前单引号引用的内容(因此未由 shell 扩展)。
一般来说,最好将所有重要的 cron 作业放入自己的脚本中,然后安排它们。这样您就可以更好地控制此类事情,并且还可以为任何特定工作选择正确的口译员(例如ksh
或bash
代替sh
)。它还使 cron 守护程序发送给您的电子邮件中的任何主题行更具可读性。