Вот что я хотел бы автоматизировать:
00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"
Вот сообщение об ошибке:
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Из crontab (5):
Шестое поле (остальная часть строки) указывает команду, которую нужно запустить. Вся командная часть строки, вплоть до новой строки или символа%, будет выполняться / bin / sh или оболочкой, указанной в переменной SHELL файла crontab. Знаки процента (%) в команде, если они не экранированы с помощью обратной косой черты (), будут заменены на символы новой строки, и все данные после первого% будут отправлены команде как стандартный ввод. Невозможно разделить одну командную строку на несколько строк, как конечный "\" оболочки.
Просто добавьте обратную косую черту перед знаками%:
00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Чтобы решить проблему избежать ваших символов%. date +%Y-%m-%d
должно быть date +\%Y-\%m-\%d
К сожалению, этот ответ немного запоздал, но проблема не в PATH или обратных кавычках - проблема просто в том, что символ процента '%' - это специальный символ, используемый для обозначения NEWLINE или STDIN в записях crontab.
Это конфликтует с вводом форматирования date
команда. Как такая команда, которая включает: date +%Y-%m-%d
будет интерпретироваться как:
date
Y-
m-
d
У меня тоже было много проблем с обратными кавычками. Иногда требуется несколько кавычек и обратных кавычек. Просто замените их на $ ().
Пример:
export NOW=`date`
by
export NOW=$(date)
-Гилсон Соарес
Это не имеет ничего общего с задними палками. Ужасно то, что cron НЕ видит ПУТЬ, и вы ДОЛЖНЫ сказать cron "что такое ПУТЬ?" снова и снова в скриптах cron.
PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here
И я за то, чтобы записать команду в файл, а не передавать ее буквально в строке cron. Гораздо элегантнее иметь
* * * * * /your/script/here
чем
* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/
эта строка может находиться внутри одного файла, chmod + x file, и этот файл должен быть вызван.