Следующее работает, как ожидалось из командной строки. Но из 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?
Я расскажу о том, что SvenW сказал, заявив, что я поместил бы эту команду в сценарий по двум причинам:
/root/bin/dump_mysql_tables_and_email_failure_report.sh
. Возможно, вы не находитесь в среде с другими администраторами, но это послужит напоминанием ты о чем, черт возьми, вы думали через год! :)Самое простое решение для проблем с экранированием cron: поместите команду в ее собственный сценарий оболочки и просто вызовите этот сценарий из cron.
Причина, по которой это не работает, заключается в том, что cron
не является bash
. Создание подоболочки с использованием скобок является частью синтаксиса bash. Ключ к разгадке находится в первом «слове» сообщения об ошибке.
Обратные кавычки будут работать для создания подоболочки, за исключением того, что вы уже используете обратные кавычки внутри своей подоболочки, поэтому вы не можете использовать их снова.
Как уже говорили другие, напишите сценарий и вызовите его из cron.