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

mat*_*teo 4 bash cron

如果我从 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
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用完全相同的命令(复制粘贴)设置 cronjob,它会失败并显示以下错误(我通过电子邮件收到通知):

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

怎么了?

poi*_*ige 12

怎么了?

根据man 5 crontab

«…

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

……»,你只是写错了。所以,对于 crontab 应该写成 date +"\%Y-\%m-\%d__\%H.\%M.\%S"


Ton*_*nny 5

  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 调用的脚本中的任何其他内容设置适当的环境。