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

Что не так с моим синтаксисом cronjob, я пытаюсь использовать обратную кавычку (`)?

Вот что я хотел бы автоматизировать:

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, и этот файл должен быть вызван.