Экранирование персонажей в 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?


Ответы:


13

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

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

2
Престижность за «какого черта ты думал через год!».
Тонни

5

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


5

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.