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