为什么这个命令不能作为 cronjob 运行,而在 shell 中输入时却可以完美运行?

为什么这个命令不能作为 cronjob 运行,而在 shell 中输入时却可以完美运行?

如果我从 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

怎么了?

根据man 5 crontab

«…

“第六个”字段(该行的其余部分)指定要运行的命令。该行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 cronfile 的 SHELL 变量中指定的 shell 执行。命令中的百分号(%),除非使用反斜杠 () 进行转义,否则将被更改为换行符,并且第一个 % 之后的所有数据都将作为标准输入发送到命令。

…”,你写错了。因此,对于 crontab 来说,应该写成 date +"\%Y-\%m-\%d__\%H.\%M.\%S"

答案2

  1. 不要将这样的复杂命令直接放在 crontab 文件中。
    将其放在脚本中并从 cron 中调用该脚本。

    默认情况下,cron-jobs 会运行sh(除非另有配置)。当您浏览脚本时,您可以通过#!/bin/bash在脚本的第一行放置或类似内容来设置要使用的正确 shell。

  2. cd ~非常危险。这完全取决于 crontab 在哪个用户 ID 下运行。不一定是您自己的用户 ID!
    所以使用cd ~userid

  3. 如果 cron 以不同的用户身份运行,该用户可以访问您的主目录吗?并且该用户是否具有与您的帐户相同的环境?另请参阅 4。

  4. cron-jobs 启动时不加载正常环境。因此,许多正常环境变量(如$PATH)不存在或仅包含有限的信息。这可能会导致从 cron 调用的程序失败。另请参阅第 1 项。您可能必须明确调用 .bashrc(或您通常使用的任何其他启动脚本)来为您放入 cron 调用脚本中的任何其他内容设置适当的环境。

相关内容