Как я могу выполнить `date` внутри задания cron?


117

Я хочу создать файл журнала для скрипта cron с текущим часом в имени файла журнала. Это команда, которую я пытался использовать:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

К сожалению, я получаю это сообщение при запуске:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

Я пытался избежать роли dateразными способами, но без особой удачи. Можно ли сделать это встроенным в файл crontab или мне нужно создать сценарий оболочки для этого?

Ответы:


180

Краткий ответ:

Побег %как \%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

Длинный ответ:

Сообщение об ошибке предполагает, что оболочка, которая выполняет вашу команду, не видит второй символ обратной галочки:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

Это также подтверждается вторым сообщением об ошибке, которое вы получили, когда попробовали один из других ответов:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

Страница man crontab подтверждает, что команда доступна только для чтения до первого неэкранированного %знака:

«Шестое» поле (остальная часть строки) указывает команду, которую нужно выполнить. Вся командная часть строки, вплоть до новой строки или %символа, будет выполняться /bin/shили оболочкой, указанной в SHELLпеременной cronfile. Знаки процента ( %) в команде, если они не экранированы обратной косой чертой ( \), будут заменены символами новой строки , и все данные после первого %будут отправлены команде в качестве стандартного ввода.


Извините за мое невежество, но где вы видите это сообщение об ошибке? Когда я делаю 'grep CRON / var / log / syslog', я не вижу сообщений об ошибках, хотя cron не работает - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Тебе

2
@ Копать_Шо_я_нашел cron отправит электронное письмо с сообщением об ошибке,
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode

7

Вы также можете поместить свои команды в файл оболочки и затем выполнить файл оболочки с помощью cron.

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

хрон

0 * * * * sh jobs.sh

6

Если вы хотите сделать строку форматирования даты в качестве переменной (чтобы избежать дублирования всей строки), НЕ экранируйте %и НЕ помещайте ее в$()

Например, при объявлении строки просто напишите:

DATEVAR=date +%Y%m%d_%H%M%S

Затем напишите заявление cron $($VARIABLE_NAME)следующим образом:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Благодаря cyberx86 , ее / его ответ на ServerFault может быть более завершена:


1
DATEVAR = "дата +% Y% m% d_% H% M% S"
Фрэнк Фанг

3

В cron вы можете использовать этот простой синтаксис:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

Выходной формат даты будет повторяться как cron_20180123.log
bala4rtraining

(1) Что вы говорите, что еще не было сказано принятым ответом? (2) Ваш ответ намного сложнее, чем вопрос. Например, вы добавили -dопцию, которая не используется в вопросе (и вы ее не объяснили). Как вы оправдываете называть этот «простой синтаксис»?
G-Man

2

Все вышеприведенные ответы используют двойные кавычки (не все из них работали для моей настройки). Это сработало для меня:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
Что вы говорите, что еще не было сказано принятым ответом? Вы говорите, что он работает лучше без кавычек, чем с кавычками? (Подсказка: это очень маловероятно.)
G-Man

Принятый ответ просто не работает для меня. Этот делает.
Мануэль Шмитцбергер

0

Основное решение:

  • использовать $()для выполнения dateкоманды и возврата вывода
  • формат даты и времени в UTC, экранируйте %символ с помощью\
  • добавить 2>&1в конце для потоковой передачи stdoutи stderrв этот файл журнала

Пример:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

Выход:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.