在 cron 中转义字符

在 cron 中转义字符

以下命令在命令提示符下按预期工作。但它在 cron 下不起作用。

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

我收到以下错误:

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

cron 中某些字符是否需要转义?或者这是 cron 中子 shell 的问题?

答案1

我将进一步阐述斯文我说我会把这个命令放入脚本中,原因有二:

  1. 它避免了 crontab 中转义字符的任何问题。
  2. 它允许您清楚地向其他管理员指出该作业的作用,而无需浪费他们的时间来解密您创建的一行魔法。例如调用脚本/root/bin/dump_mysql_tables_and_email_failure_report.sh。您可能不在与其他管理员相同的环境中,但这将有助于提醒一年后你到底在想什么!:)

答案2

解决 cron 逃逸问题最简单的方法:将命令放在它自己的 shell 脚本中,然后从 cron 调用该脚本。

答案3

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

反引号可以用于创建子 shell,但前提是您已经在子 shell 内部使用了反引号,因此不能再次使用它们。

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

相关内容