Як я можу виконати `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 ')'

Відображення сторінки crontab підтверджує, що команда зчитується лише до першого %знаку, який не має значення:

Поле "шосте" (решта рядка) вказує команду, яку потрібно виконати. Вся командна частина рядка, аж до нової лінії чи %символу, буде виконуватися /bin/shоболонкою або оболонкою, зазначеною в SHELLзмінній cronfile. Знаки відсотків ( %) у команді, якщо не уникнути зворотної косої риски ( \), будуть змінені в символи нового рядка , і всі дані після першого %будуть надсилатися команді як стандартне введення.


Вибачте за моє незнання, але де ви бачите ці повідомлення про помилки? Коли я роблю «Grep 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"
Frank Fang

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.