1

Я борюсь с cronjob, который не работает. Каждый раз, когда он выполняется, появляется сообщение об ошибке

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

Вот мой crontab:

# Delete logfile from last week
00 21 * * * rm /var/log/dumping_$(date -d @$(( $(date "+%s") + 86400 )) "+%u").log

Я пробовал несколько вариантов, например

00 21 * * * 'rm /var/log/dumping_$(date -d @$(( $(date "+%s") + 86400 )) "+%u").log'

00 21 * * * /bin/bash -c 'rm /var/log/dumping_$(date -d @$(( $(date "+%s") + 86400 )) "+%u").log'

Никто из них не работал как cronjob. Конечно, это работает, когда я ввожу его в командной строке напрямую. Какой будет правильный синтаксис?

2 ответа2

2

% имеет специальное значение в cronjobs - это означает, что впоследствии текст передается как stdin команде перед ним. Чтобы использовать буквальный знак процента, либо попытаться \ избежать его или просто переместить все во внешний сценарий и называют , что из кронтаба.

(ИМХО, когда он вкладывает $(…) более двух раз, это верный признак того, что его следует извлечь в скрипт.)

Обратите внимание, что вы также можете использовать date -d tomorrow +%u вместо вычисления вручную.

0

Основное отличие состоит в том, что ваша оболочка при запуске вручную, скорее всего, bash, а cron по умолчанию sh. Я не могу с уверенностью сказать, что это является источником проблемы, но, учитывая, что ваша строка несколько сложна (например, множество специальных символов, которые могут интерпретироваться по-разному между различными оболочками и интерпретаторами), вы можете извлечь выгоду из залипания команда rm со всеми ее аргументами в сценарии и вызов сценария из cron. По крайней мере, это будет первое, что я попробую.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .