URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 55261
[ Назад ]

Исходное сообщение
"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не по числу ?"

Отправлено pinhunt3r , 07-Апр-05 10:36 
  Нужно в кроне каждый последний день месяца выполнять один скрипт,
  но прикол в том, что там дни: (0 - 31) , а если в месяце меньше чем 31  
  день, что тогда? Как сделать так, чтоб именно в каждый ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в месяце... How to?

  


Содержание

Сообщения в этом обсуждении
"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено allez , 07-Апр-05 12:18 
>  Нужно в кроне каждый последний день месяца выполнять один скрипт,
>
>  но прикол в том, что там дни: (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 на все месяцы.
Дальше, я думаю, разберетесь сами. Успехов!


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено pinhunt3r , 07-Апр-05 13:06 
>>  Нужно в кроне каждый последний день месяца выполнять один скрипт,
>>
>>  но прикол в том, что там дни: (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"... ?


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено jonatan , 07-Апр-05 12:30 
Можно выполнять в первый день месяца. Не думаю, что это трагедия.

05 0 1 * * root run-parts /etc/cron.monthly


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено pinhunt3r , 07-Апр-05 13:07 
>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>
>05 0 1 * * root run-parts /etc/cron.monthly

Ну это и так понятно, но мне нужно именно в каждый последний день, типа такое требование у руководства %)


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено Nimdar , 07-Апр-05 13:19 
1. apt-get install at
2. Неужели 5 минут так критично? :) Да и руководству можно сказать, что задание выполняется в последний день месяца ночью, проверять думаю, не станут :)

"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено pinhunt3r , 07-Апр-05 14:09 
>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...


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено lavr , 07-Апр-05 13:51 
>>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>>
>>05 0 1 * * root run-parts /etc/cron.monthly
>
> Ну это и так понятно, но мне нужно именно в каждый
>последний день, типа такое требование у руководства %)

поиск по фроуму или архивам форума, уже расписывали варианты


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено pinhunt3r , 07-Апр-05 14:10 
>>>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>>>
>>>05 0 1 * * root run-parts /etc/cron.monthly
>>
>> Ну это и так понятно, но мне нужно именно в каждый
>>последний день, типа такое требование у руководства %)
>
>поиск по фроуму или архивам форума, уже расписывали варианты

Был вариант...

30 23 * * * root   if ( `date -v +1d "+%d"` == 01 ) твоя_команда

Но это работает под bsd и не работает под debian


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено lavr , 07-Апр-05 14:25 
>>>>Можно выполнять в первый день месяца. Не думаю, что это трагедия.
>>>>
>>>>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


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено Agp , 07-Апр-05 13:59 
> Ну это и так понятно, но мне нужно именно в каждый
>последний день, типа такое требование у руководства %)

Можно часы поставить на 5 минут вперед. :)


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено pinhunt3r , 07-Апр-05 14:05 
>> Ну это и так понятно, но мне нужно именно в каждый
>>последний день, типа такое требование у руководства %)
>
>Можно часы поставить на 5 минут вперед. :)

  Нестандартный ход, мне нравится :) но к сожалению там система критична к точному времени и даже синхронизируется с мировым..


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено bakake , 08-Апр-05 18:45 
>критична к точному времени и даже синхронизируется с мировым..
Может быть такой изврат спасет отца мирового времени?
[ $(cal | grep -v '[A-Z]' | grep '[0-9]$' | awk '{print $(NF)}' | tail -n 1) -eq $(date +%d) ] && echo 'Yolochka gori!'


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено Muke , 08-Апр-05 20:47 
>  Нужно в кроне каждый последний день месяца выполнять один скрипт,
>
>  но прикол в том, что там дни: (0 - 31)
>, а если в месяце меньше чем 31
>  день, что тогда? Как сделать так, чтоб именно в каждый
>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>месяце... How to?
>
>

а в чем проблема? 12 месяцев - 12 строк. или надо обязательно в одну уложиться?


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено lavr , 08-Апр-05 20:49 
>>  Нужно в кроне каждый последний день месяца выполнять один скрипт,
>>
>>  но прикол в том, что там дни: (0 - 31)
>>, а если в месяце меньше чем 31
>>  день, что тогда? Как сделать так, чтоб именно в каждый
>>ПОСЛЕДНИЙ день месяца выполнялся скрипт, а не по определеному числу в
>>месяце... How to?
>>
>>
>
>а в чем проблема? 12 месяцев - 12 строк. или надо обязательно
>в одну уложиться?

угу, и еще учесть високосный год, итого сколько строк? ;)


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено Quarc , 09-Апр-05 00:00 
Такой вариант: cron'у запихать выполнять 28,29,30 и 31 числа скрипт который проверяет текущий день на то является ли он последним и если да то уже дальше выполняет нужный вам скрипт
Вот пример скрипта проверки от нечего делать нацарапал:

#!/bin/sh
DAY=`date +%e`
MONTH=`date +%m`
YEAR=$[`date +%Y`%4]
F=0

if [ $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
fi

if [ $F == 1 ]; then
#Здесь делаем что надо
echo "last day"
fi

PS:скрипт не критиковать, в шелл скриптинге я полный ноль, хотя этот вроде работает :)


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено pinhunt3r , 09-Апр-05 15:38 

Солюшн найден, спасибо народ :)

"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено allez , 11-Апр-05 08:01 
>
> Солюшн найден, спасибо народ :)

А какое, если не секрет?


"Cron - как выполнить комманду в ПОСЛЕДНИЙ день месяца, а не ..."
Отправлено regunkov , 12-Апр-05 13:13 
>  Нужно в кроне каждый последний день месяца выполнять один скрипт,
>
>  но прикол в том, что там дни: (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