2016-08-10 3 views
1

У меня возникла проблема с использованием команды linux 'date' внутри cronjob.Использовать команду даты linux в cronjob

Linux версия: CentOS Linux 7 (основной)

Что мне нужно, это дата 9 дней назад в качестве параметра моего test.sh сценария. Сегодня 10-08-2016, работа, которая должна быть выполнена в:

/scripts/test.sh 2016-08-01 

Мой код в кронтаб:

DATEVAR=$(date +%F --date="9 days ago") 
0 12 * * tue ~/scripts/test.sh $($DATEVAR) 

Так команда Linux является «дата +% F --date = "9 дней назад", но мне нужно, чтобы это было выполнено и задано как параметр. Что она делает сейчас запустить скрипт с таким параметром «$ (дата»:

~/scripts/test.sh $(date 

Я попытался установить DATEVAR со следующими вещами без Succes:

DATEVAR='date +%F --date="9 days ago"' 
DATEVAR=date +%F --date="9 days ago" 
DATEVAR=$(date +%F --date="9 days ago") 
DATEVAR=(shell date +%F --date="9 days ago") 

Кто-нибудь, если это знать возможно, и как мой DATEVAR может быть установлен в результате выполнения команды «дата»?

+0

Здесь недостаточно информации для предоставления авторитетного ответа. Какой вкус Linux вы используете? Некоторые (Ubuntu?) Не используют bash как '/ bin/sh', а некоторые оболочки могут не поддерживать' $ (..) 'нотацию. Вместо этого попробуйте backquotes. Также экспериментируйте с побегом ваших процентов символов.Кроме того, '$ ($ DATEVAR)', вероятно, неверен (в вашем crontab), так как вы будете выполнять вывод команды 'date', как если бы это был комментарий. – ghoti

+0

Возможный дубликат http://stackoverflow.com/questions/27123367/percent-sign-not-working-in-crontab – tripleee

ответ

0

Это должно работать:

0 12 * * tue _DV=`date +\%F --date="9 days ago"`; ~/scripts/test.sh $_DV 

К сожалению, есть несколько вопросов, которые преодолевают здесь. Во-первых, тот факт, что cron теперь поддерживает «настройки среды», может быть очень ошибочным. Люди с опытом работы с оболочкой могут легко предположить, что здесь можно использовать полную мощность оболочки - она ​​не может. Эти настройки такие же глупые, как и они: они строгие дословные замены. На мой взгляд, лучший прозвище будет «назначением заполнителя».

Во-вторых, строка даты, которую вы хотите использовать, несколько сложна. В частности, он содержит встроенную строку с кавычками («9 дней назад») и специальный символ crontab (сюрприз!): «%» В выражении «+% F». Cron заменяет «%» на новые строки - приятная функция, но удивительно, если вы не знаете или не забываете об этом. И цитаты не переживают фазу назначения.

Зная это, альтернатива выше записи, которая использует «назначение шаблонного» является:

DT1 = date +%F 
DT2 = 9 days ago 

0 12 * * tue _DV=`$DT1 --date="$DT2"`; ~/scripts/test.sh $_DV 

Здесь мы захватывая куски, которые мы хотим быть непосредственно замещен без интерполяции.

Там - два решения по цене одного!

+0

Это работает! Спасибо:) –

0

Я не уверен, что вы можете сделать это в хрон.

Простым решением является обернуть ваш вызов test.sh в другой скрипт без аргументов. В нем просто напишите:

DATEVAR=$(date +%F --date="9 days ago") 
~/scripts/test.sh $($DATEVAR) 

Позвоните в один из ваших кроны.

+0

Спасибо за ваш вклад! Я думаю, что это будет самая легкая работа и лучшее решение. –

Смежные вопросы