如果我从shell运行这个命令,它按预期工作:
cd ~ && mysqldump --databases --skip-dump-date --host=localhost --user=admin --password=xxxxx --lock-all-tables --result-file=xxxxx_dump_tmp.sql mydb && gzip xxxxx_dump_tmp.sql && mv xxxxx_dump_tmp.sql.gz xxxxx_dump_`date +"%Y-%m-%d__%H.%M.%S"`.sql.gz
但是,如果我使用完全相同的命令(复制粘贴)设置了cronjob,则会失败并显示以下错误(我通过电子邮件收到通知):
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file
怎么了?
怎么了?
根据man 5 crontab :
«…
“第六”字段(行的其余部分)指定要运行的命令。 行的整个命令部分,直到换行符或%字符,将由/ bin / sh或由cronfile的SHELLvariables中指定的shell来执行。 命令中的百分号(%),除非使用反斜线()进行转义,否则将被改为换行符,并且第一个%之后的所有数据将作为标准input发送到该命令。
…»,你只是写错了。 因此,对于crontab应该写成date +"\%Y-\%m-\%d__\%H.\%M.\%S"
不要把这样一个复杂的命令直接放在crontab文件中。
把它放在脚本中,并从cron调用脚本。
默认情况下,cron-jobs通过sh运行(除非另有configuration)。 当你浏览一个脚本时,你可以通过在脚本的第一行放置一个#!/bin/bash或者其他的东西来设置合适的shell。
cd ~很危险。 这完全取决于在哪个用户ID下运行crontab。 不一定是你自己的用户名!
所以使用cd ~userid 。
如果cron作为不同的用户运行,那么用户可以访问你的home-dir? 并让该用户具有与您的帐户相同的环境? 另见4。
cron-jobs在不加载正常环境的情况下启动。 所以许多正常的环境variables(如$PATH )不存在或只包含有限的信息。 这可能会导致从cron调用的程序失败。 另请参阅第1项。您可能必须明确地调用.bashrc(或其他您通常使用的启动脚本)来为放置在您的cron调用脚本中的其他任何内容设置适当的环境。