【问题标题】:Syntax error only when command is run from cron仅在从 cron 运行命令时出现语法错误
【发布时间】:2010-07-22 20:58:57
【问题描述】:

这个命令:

/usr/bin/mysqldump --add-drop-table -u myuser -pmypass mydb > "/home/myuser/dbBackups/"`date +%Y%m%d`".sql"

在命令行中运行良好,但是当 b cron 运行它时,我得到了

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

该命令也都在 crontab 中的一行,所以我对第 0 行和第 1 行的引用感到困惑......

谁能告诉我我在那里做错了什么?

【问题讨论】:

  • 当您从命令行运行时,您是否使用与 cron 相同的 shell (/bin/sh)?
  • 提到哪个 unix 会有所帮助。从可用信息中我唯一能猜到的是您的登录 shell 可能不是 /bin/sh,因此请尝试运行 /bin/sh,然后运行您的命令。哦,还要检查以确保您没有意外地用制表符代替空格 - cron 可能会对此感到困惑。
  • 啊!我正在运行 bash 而 cron 不是。知道 /bin/sh 中正确的反引号语法是什么吗?我真的只熟悉bash。服务器是 Linux。
  • 嗯,你使用的语法在我试过的 Linux 机器上的 sh 上工作,但你可能有不同的版本。你可以在这里粘贴 sh --version 的输出吗?另外,要验证 cron 中没有多余的字符,您能否粘贴运行时该行的显示方式:crontab -l |猫-兽医
  • 反引号在 /bin/sh 和 bash 上是一样的。

标签: unix command-line cron


【解决方案1】:

这显然是个愚蠢的问题,但是您的 crontab (crontab -l) 中有匹配的反引号吗?

第一行、零行的内容不是指 crontab 中的行,而是指单行脚本中的“行”。

更新:

啊,我想我明白了。这是来自 crontab(5):

Percent-signs (%) in the command, unless escaped with backslash (\),
will be changed into newline characters, and all data after the
first % will be sent to the command as standard input.

因此,您的日期规范中的百分比字符被解释为换行符,这意味着反引号不会在换行符之前终止,这会产生您的错误消息。

所以转义百分比字符。我忘记了关于 crontab 的事情......

【讨论】:

  • 当然可以;上面的 cmd 正是它减去了实际的 un/pw/db 名称。
【解决方案2】:

最简单的解决方法可能是将整个命令放在一个 shell 脚本中,然后运行它。因此,制作一个包含您列出的命令的 scriptName.sh 文件,并让 crontab 调用该脚本。这解决了所有这些奇怪的问题。

【讨论】:

  • 我已经尝试了一个小时让 cron 运行 .sh,但我得到的只是“SyntaxError: invalid syntax”。该死的linux!
【解决方案3】:

从 cron 执行的命令无法从您的登录 shell 访问环境变量,包括路径。因此,请尝试以下操作(添加迄今为止的完全限定路径):

/usr/bin/mysqldump --add-drop-table -u myuser -pmypass mydb > "/home/myuser/dbBackups/"`/usr/bin/date +%Y%m%d`".sql"

当然,通过运行which date 来验证您的date 命令是否位于其他位置,然后在必要时调整路径。

【讨论】:

  • 这是一个很好的观点,我以后会牢记在心。没有解决这个问题,但我绝对应该确保其中包含完整路径。
猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2021-11-14
相关资源
最近更新 更多