如果我从 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
怎么了?
答案1
怎么了?
«…
“第六个”字段(该行的其余部分)指定要运行的命令。该行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 cronfile 的 SHELL 变量中指定的 shell 执行。命令中的百分号(%),除非使用反斜杠 () 进行转义,否则将被更改为换行符,并且第一个 % 之后的所有数据都将作为标准输入发送到命令。
…”,你写错了。因此,对于 crontab 来说,应该写成
date +"\%Y-\%m-\%d__\%H.\%M.\%S"
答案2
不要将这样的复杂命令直接放在 crontab 文件中。
将其放在脚本中并从 cron 中调用该脚本。默认情况下,cron-jobs 会运行
sh
(除非另有配置)。当您浏览脚本时,您可以通过#!/bin/bash
在脚本的第一行放置或类似内容来设置要使用的正确 shell。cd ~
非常危险。这完全取决于 crontab 在哪个用户 ID 下运行。不一定是您自己的用户 ID!
所以使用cd ~userid
。如果 cron 以不同的用户身份运行,该用户可以访问您的主目录吗?并且该用户是否具有与您的帐户相同的环境?另请参阅 4。
cron-jobs 启动时不加载正常环境。因此,许多正常环境变量(如
$PATH
)不存在或仅包含有限的信息。这可能会导致从 cron 调用的程序失败。另请参阅第 1 项。您可能必须明确调用 .bashrc(或您通常使用的任何其他启动脚本)来为您放入 cron 调用脚本中的任何其他内容设置适当的环境。