Назад | Перейти на главную страницу

Экранирование символов в cron

Следующее работает, как ожидалось из командной строки. Но из 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 сказал, заявив, что я поместил бы эту команду в сценарий по двум причинам:

  1. Это позволяет избежать проблем с экранированием символов в crontab.
  2. Это позволяет вам четко указать вашим коллегам-администраторам, что делает ваша работа, не тратя зря их циклы на расшифровку созданной вами однострочной магии. Например, вызов сценария /root/bin/dump_mysql_tables_and_email_failure_report.sh. Возможно, вы не находитесь в среде с другими администраторами, но это послужит напоминанием ты о чем, черт возьми, вы думали через год! :)

Самое простое решение для проблем с экранированием cron: поместите команду в ее собственный сценарий оболочки и просто вызовите этот сценарий из cron.

Причина, по которой это не работает, заключается в том, что cron не является bash. Создание подоболочки с использованием скобок является частью синтаксиса bash. Ключ к разгадке находится в первом «слове» сообщения об ошибке.

Обратные кавычки будут работать для создания подоболочки, за исключением того, что вы уже используете обратные кавычки внутри своей подоболочки, поэтому вы не можете использовать их снова.

Как уже говорили другие, напишите сценарий и вызовите его из cron.