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

31

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

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
Терри Г Лорбер
источник
2
Помимо ошибки выдачи, рассмотрите возможность поместить это в скрипт Schell. Это сделает вид, что crontab неуклюж, и вы можете добавить комментарии и конфигурацию в ваш файл скрипта.
PeterMmm

Ответы:

67

Из 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`"
Жулиано
источник
8

Чтобы решить проблему, избегайте ваших% символов . date +%Y-%m-%dдолжно бытьdate +\%Y-\%m-\%d

К сожалению, этот ответ немного запоздал, но проблема заключается не в PATH или обратных галочках - проблема в том, что символ процента «%» - это специальный символ, используемый для обозначения NEWLINE или STDIN в записях crontab .

Это противоречит форматированию ввода dateкоманды. Как таковая команда, которая включает в себя: date +%Y-%m-%dбудет интерпретироваться как:

date Y- m- d

Эрик Кигати
источник
4

У меня также было много проблем со спиной. Иногда вам нужно более одного появления кавычек и обратных кавычек. Просто замените их на $ ().

Пример:

export NOW=`date`
by
export NOW=$(date)

-Гилсон Соареш

Guilsson
источник
1
+1 В любом случае, это любимый синтаксис.
Дэн Карли
4
но это не имеет ничего общего с вопросом пользователя.
Аарон Браун
1
Конечно, о бэкстексе, прочитайте вопрос еще раз.
Серхио Абреу
Спасибо, мне потребовалось некоторое время, чтобы понять, что обратные удары ломают мои кроны - теперь я тоже начал использовать $ () во всех своих сценариях
Эрик Кигати
-2

Это не имеет ничего общего с фоном. Ужасно то, что cron НЕ видит PATH, и вы ДОЛЖНЫ сказать cron "что такое PATH?" снова и снова в скриптах 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, и этот файл вызывается.

Серхио Абреу
источник