Экранирование персонажей в 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? Или это проблема с subshell в cron?

shantanuo
источник
Дубликат serverfault.com/questions/274475/… ?
Hubbitus

Ответы:

13

Я более подробно остановлюсь на том, что сказал SvenW , заявив, что я поместил бы эту команду в скрипт по двум причинам:

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

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

Свен
источник
5

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

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

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

Ladadadada
источник