在cron中转义字符


9

下面的命令按预期方式工作。但这在cron中不起作用。

mysqldumpslow <(tail -1000 `mysqladmin variables \
    | grep slow_query_log_file | awk '{print $4}'`) \
    | mail -s "slow log from `hostname` sorted by time" shantanu.oak`hostname`@gmail.com \
    > /root/slow_succ.txt 2> /root/slow_err.txt

我收到以下错误:

/bin/sh: -c: line 0: syntax error near unexpected token `('

某些字符需要在cron中转义吗?还是cron中的subshel​​l问题?


Answers:


13

我将进一步说明SvenW所说的内容,因为有两个原因,我会将此命令放入脚本中:

  1. 它避免了在crontab中转义字符的任何问题。
  2. 它使您可以清楚地向其他管理员指示该工作是做什么的,而不会浪费他们的任何周期来解密您创建的单线魔术。如调用脚本/root/bin/dump_mysql_tables_and_email_failure_report.sh。您可能没有与其他管理员在一起的环境,但这可以提醒一年后您在想什么!:)

2
对于“一年后您在想什么!”表示敬意。
托尼2012年

5

解决cron转义问题的最简单解决方案:将命令放入自己的shell脚本中,然后从cron调用此脚本。


5

它不起作用的原因cron是没有bash。使用括号创建子外壳是bash语法的一部分。出现此错误的线索是错误消息的第一个“单词”。

反引号可以用来创建子Shell,除非您已经在子Shell中使用了反引号,所以您不能再使用它们了。

正如其他人已经说过的那样,编写脚本并从cron调用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.