Нужно в кроне каждый последний день месяца выполнять один скрипт,
но прикол в том, что там дни: (0 - 31) , а если в месяце меньше чем 31
день, что тогда? Как сделать так, чтоб именно в каждый ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в месяце... How to?
> Нужно в кроне каждый последний день месяца выполнять один скрипт,
>
> но прикол в том, что там дни: (0 - 31)
>, а если в месяце меньше чем 31
> день, что тогда? Как сделать так, чтоб именно в каждый
>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>месяце... How to?
>
>Воспользуйтесь для этой цели at:
># at 01.05.05 - 1 day
>warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
>at> ls
>at> <EOT>
>job 16 at 2005-04-30 16:06Как видно из этого примера, была задана дата "первое мая минус один день",
в ответ на что утилита сказала, что работа будет выполнена 30 апреля.
В общем, раз в год через cron можно давать задания at на все месяцы.
Дальше, я думаю, разберетесь сами. Успехов!
>> Нужно в кроне каждый последний день месяца выполнять один скрипт,
>>
>> но прикол в том, что там дни: (0 - 31)
>>, а если в месяце меньше чем 31
>> день, что тогда? Как сделать так, чтоб именно в каждый
>>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>>месяце... How to?
>>
>>
>
>Воспользуйтесь для этой цели at:
>># at 01.05.05 - 1 day
>>warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
>>at> ls
>>at> <EOT>
>>job 16 at 2005-04-30 16:06
>
>Как видно из этого примера, была задана дата "первое мая минус один
>день",
>в ответ на что утилита сказала, что работа будет выполнена 30 апреля.
>
>В общем, раз в год через cron можно давать задания at на
>все месяцы.
>Дальше, я думаю, разберетесь сами. Успехов!Насколько я понимаю, в debian linux нет комманды "at"... ?
Можно выполнять в первый день месяца. Не думаю, что это трагедия.05 0 1 * * root run-parts /etc/cron.monthly
>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>
>05 0 1 * * root run-parts /etc/cron.monthlyНу это и так понятно, но мне нужно именно в каждый последний день, типа такое требование у руководства %)
1. apt-get install at
2. Неужели 5 минут так критично? :) Да и руководству можно сказать, что задание выполняется в последний день месяца ночью, проверять думаю, не станут :)
>1. apt-get install at
>2. Неужели 5 минут так критично? :) Да и руководству можно сказать,
>что задание выполняется в последний день месяца ночью, проверять думаю, не
>станут :)# apt-get install at
Reading Package Lists... Done
Building Dependency Tree... Done
You might want to run `apt-get -f install' to correct these:
The following packages have unmet dependencies:
libpam-modules: Depends: libdb3 (>= 3.2.9-20) but 3.2.9-16 is to be installed
webmin-exim: Depends: webmin but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
Вот такая байда... К сожалению раньше не юзал apt-get...
>>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>>
>>05 0 1 * * root run-parts /etc/cron.monthly
>
> Ну это и так понятно, но мне нужно именно в каждый
>последний день, типа такое требование у руководства %)поиск по фроуму или архивам форума, уже расписывали варианты
>>>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>>>
>>>05 0 1 * * root run-parts /etc/cron.monthly
>>
>> Ну это и так понятно, но мне нужно именно в каждый
>>последний день, типа такое требование у руководства %)
>
>поиск по фроуму или архивам форума, уже расписывали вариантыБыл вариант...
30 23 * * * root if ( `date -v +1d "+%d"` == 01 ) твоя_команда
Но это работает под bsd и не работает под debian
>>>>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>>>>
>>>>05 0 1 * * root run-parts /etc/cron.monthly
>>>
>>> Ну это и так понятно, но мне нужно именно в каждый
>>>последний день, типа такое требование у руководства %)
>>
>>поиск по фроуму или архивам форума, уже расписывали варианты
>
> Был вариант...
>
>30 23 * * * root if ( `date -v
>+1d "+%d"` == 01 ) твоя_команда
>
> Но это работает под bsd и не работает под debian
в ответе были все варианты включая date от bsd и linux + гнусный date (gdate), формат последнего не зависит от OS
> Ну это и так понятно, но мне нужно именно в каждый
>последний день, типа такое требование у руководства %)Можно часы поставить на 5 минут вперед. :)
>> Ну это и так понятно, но мне нужно именно в каждый
>>последний день, типа такое требование у руководства %)
>
>Можно часы поставить на 5 минут вперед. :)Нестандартный ход, мне нравится :) но к сожалению там система критична к точному времени и даже синхронизируется с мировым..
>критична к точному времени и даже синхронизируется с мировым..
Может быть такой изврат спасет отца мирового времени?
[ $(cal | grep -v '[A-Z]' | grep '[0-9]$' | awk '{print $(NF)}' | tail -n 1) -eq $(date +%d) ] && echo 'Yolochka gori!'
> Нужно в кроне каждый последний день месяца выполнять один скрипт,
>
> но прикол в том, что там дни: (0 - 31)
>, а если в месяце меньше чем 31
> день, что тогда? Как сделать так, чтоб именно в каждый
>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>месяце... How to?
>
>а в чем проблема? 12 месяцев - 12 строк. или надо обязательно в одну уложиться?
>> Нужно в кроне каждый последний день месяца выполнять один скрипт,
>>
>> но прикол в том, что там дни: (0 - 31)
>>, а если в месяце меньше чем 31
>> день, что тогда? Как сделать так, чтоб именно в каждый
>>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>>месяце... How to?
>>
>>
>
>а в чем проблема? 12 месяцев - 12 строк. или надо обязательно
>в одну уложиться?угу, и еще учесть високосный год, итого сколько строк? ;)
Такой вариант: cron'у запихать выполнять 28,29,30 и 31 числа скрипт который проверяет текущий день на то является ли он последним и если да то уже дальше выполняет нужный вам скрипт
Вот пример скрипта проверки от нечего делать нацарапал:#!/bin/sh
DAY=`date +%e`
MONTH=`date +%m`
YEAR=$[`date +%Y`%4]
F=0if [ $DAY == 31 ]; then
F=1
else
if [ $MONTH == "02" ]; then
if [ $DAY == 29 ]; then
F=1
else
if [ $YEAR != 0 ] && [ $DAY == 28 ]; then
F=1
fi
fi
fi
if [ $MONTH == "04" ] || [ $MONTH == "06" ] || [ $MONTH == "09" ] || [ $MONTH == "11" ]; then
if [ $DAY == 30 ]; then
F=1;
fi
fi
fiif [ $F == 1 ]; then
#Здесь делаем что надо
echo "last day"
fiPS:скрипт не критиковать, в шелл скриптинге я полный ноль, хотя этот вроде работает :)
Солюшн найден, спасибо народ :)
>
> Солюшн найден, спасибо народ :)А какое, если не секрет?
> Нужно в кроне каждый последний день месяца выполнять один скрипт,
>
> но прикол в том, что там дни: (0 - 31)
>, а если в месяце меньше чем 31
> день, что тогда? Как сделать так, чтоб именно в каждый
>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>месяце... How to?
>
>Внесу свою лепту - в одну строку.
let $((`date +%d -d "tomorrow"`-1)) || echo OK\!
так корректнее
((! ((`date +%d -d "tomorrow"`-1)))) && echo OK\!
ну или
if test ! $((`date +%d -d "tomorrow"`-1)); then echo OK\!; fi