以下命令在命令提示符下按预期工作。但它在 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
我将进一步阐述斯文我说我会把这个命令放入脚本中,原因有二:
- 它避免了 crontab 中转义字符的任何问题。
- 它允许您清楚地向其他管理员指出该作业的作用,而无需浪费他们的时间来解密您创建的一行魔法。例如调用脚本
/root/bin/dump_mysql_tables_and_email_failure_report.sh
。您可能不在与其他管理员相同的环境中,但这将有助于提醒你一年后你到底在想什么!:)
答案2
解决 cron 逃逸问题最简单的方法:将命令放在它自己的 shell 脚本中,然后从 cron 调用该脚本。
答案3
它不起作用的原因是cron
不是bash
。使用括号创建子 shell 是 bash 语法的一部分。错误消息的第一个“单词”中有一个线索。
反引号可以用于创建子 shell,但前提是您已经在子 shell 内部使用了反引号,因此不能再次使用它们。
正如其他人已经说过的,编写一个脚本并从 cron 调用它。