Как запустить задачу только при загрузке кронтаба?

Обсуждение программ nnCron и nnCron LITE

Как запустить задачу только при загрузке кронтаба?

Postby Egres » Thu, 20 Mar 2008, 16:32

Собственно вопрос в том, чтобы проинициализировать некоторые переменные, например, значением, полученным из FILE-EXIST.
Насколько я понимаю, сделать это встроенными средствами нельзя, т.к., судя по help-у, переменную можно инициализировать только константой. Следовательно, возникает вопрос, как это сделать с помощью задачи, которая выполнялась бы только при загрузке/перезагрузке кронтаба?
Для чего это нужно? - Сейчас выполняется инициализация задачей, запускаемой по загрузке системы, но после редактирования кронтаба происходит его перезагрузка и задача инициализации не выполняется.
Или есть другие решения?
Egres
 
Posts: 7
Joined: Thu, 20 Mar 2008, 12:07

Re: Как запустить задачу только при загрузке кронтаба?

Postby SeMa » Thu, 20 Mar 2008, 18:51

Code: Select all
RunOnce
NoDel

Читай справку "Опции задачи".
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Как запустить задачу только при загрузке кронтаба?

Postby Egres » Fri, 21 Mar 2008, 10:54

SeMa wrote:
Code: Select all
RunOnce
NoDel

Читай справку "Опции задачи".

Уважаемый SeMa. Возможно, я чего-то недопонимаю, но у меня сложилось впечатление, что Вы не совсем поняли поставленную задачу.
Попробуйте предложенное Вами решение сами. Для этого создайте задачу с NoDel RunOnce и повторите перезагрузку кронтаба после ее выполнения. Они больше НЕ выполнится, т.к. становится неактивной. Это первое.
Второе - задача выполнится не по загрузке кронтаба, а по наступлении 0 секунды.
Повторяю: нужна возможность инициализации переменной вычисляемым выражением (так же, как и константой) при КАЖДОЙ ЗАГРУЗКЕ кронтаба.
Egres
 
Posts: 7
Joined: Thu, 20 Mar 2008, 12:07

Re: Как запустить задачу только при загрузке кронтаба?

Postby SeMa » Fri, 21 Mar 2008, 22:29

Egres wrote:
SeMa wrote:
Code: Select all
RunOnce
NoDel

Читай справку "Опции задачи".

Уважаемый SeMa. Возможно, я чего-то недопонимаю, но у меня сложилось впечатление, что Вы не совсем поняли поставленную задачу.
Попробуйте предложенное Вами решение сами. Для этого создайте задачу с NoDel RunOnce и повторите перезагрузку кронтаба после ее выполнения.

Уважаемый Egres. Я не знаю, какая у Вас задача. Можно было бы для примера показать кусок кода, а лучше задачу, в которой не выполняется желаемое действие.
В справке написано:
Совместное использование опций RunOnce и NoDel позволяет запускать задачу при каждом перечитывании кронтаба.

Egres wrote:Они больше НЕ выполнится, т.к. становится неактивной. Это первое.

Естественно. Совместное использование этих слов выполняет условия, описанные в документации, а именно:
После отработки задача больше не выполняется и значения переменных, описанных и измененных в задаче остаются в состоянии последних изменений.
После перечитывания кронтаба значения переменных сбрасываются в исходное состояние, указанное в части их объявления.
Egres wrote:Второе - задача выполнится не по загрузке кронтаба, а по наступлении 0 секунды.

В спецификации времени ннКрона нет возможности задать секунды (как и в UNIX'е, откуда взят временнОй формат). Естественно, что любая задача будет выполняться в начале минуты, т.е. в 0 секунд, т.к. при перечитывании кронтабов ннКрон перекомпилирует задачи с указанными временами, в которых нет указания секунд.
Egres wrote:Повторяю: нужна возможность инициализации переменной вычисляемым выражением (так же, как и константой) при КАЖДОЙ ЗАГРУЗКЕ кронтаба.

Если у Вас какая-то специфическая задача, попробуйте инициализировать переменые в исполняемом блоке после Action:
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Как запустить задачу только при загрузке кронтаба?

Postby Egres » Sat, 22 Mar 2008, 11:21

Спасибо, SeMa, я понял, что в nncron-е нет событий "конец компиляции кронтаба" или "загрузка кронтаба" (а я надеялся, что в справке не всё описано :) ), а именно они и нужны, т.к. к моменту запуска задачи переменные хотелось бы иметь уже инициализированными.
Задача, конечно, решается элементарно, но не красиво, т.к. приходится вводить доп. анализы, анализируя первый ли раз выполняется задача после перезагрузки. А состоит она в том, чтобы вести лог факта переключения состояния переключателя "есть/нет", состояние которого, естественно, неизвестно до первого выполнения задачи.
Еще раз спасибо.
Egres
 
Posts: 7
Joined: Thu, 20 Mar 2008, 12:07

Re: Как запустить задачу только при загрузке кронтаба?

Postby Egres » Sun, 23 Mar 2008, 11:04

Задача решилась так:

#( Загрузка_кронтаба
\ если лог-файл новый для каждого дня, то:
WatchFile: "c:\Program Files\nnCron\log\%MM%%DD%cron.log"
RunOnce
NoDel
Action:
\ здесь задаются значения переменных
)#

Т.к. лог-файл сразу же после загрузки кронтаба наверняка будет изменен - в него, как минимум, добавится строчка "Load crontab", то и задача выполнится, не дожидаясь начала минуты.
К сожалению, с помощью GUI нельзя задать такой набор опций, только прямым редактированием кронтаба, но задача работает правильно.

На самом деле, SeMa, мне было просто интересно найти событие, "конец компиляции кронтаба". Поскольку такового нет, то и пришлось "выкручивать" себе руки. :)
Еще раз спасибо.
Egres
 
Posts: 7
Joined: Thu, 20 Mar 2008, 12:07

Re: Как запустить задачу только при загрузке кронтаба?

Postby VoidVolker » Sun, 23 Mar 2008, 14:43

Вообще, достаточно просто немного обыкновенной логики: что происходит при перечитывании кронтаба? Его компиляция! А значит весь код в кронтабе будет автоматически выполнен.
Code: Select all
#( Загрузка_кронтаба
\ здесь задаются значения переменных
Action:
)#

Можно обойтись и без задачи:
Code: Select all
<%
\ здесь задаются значения переменных
%>

Добавить в начале кронтаба - и каждый раз при перечитывании кронтаба этот код будет выполнен.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Как запустить задачу только при загрузке кронтаба?

Postby AlikasS » Tue, 01 Apr 2008, 01:26

Egres wrote:Спасибо, SeMa, я понял, что в nncron-е нет событий "конец компиляции кронтаба" или "загрузка кронтаба" (а я надеялся, что в справке не всё описано :) ), а именно они и нужны, т.к. к моменту запуска задачи переменные хотелось бы иметь уже инициализированными.
Задача, конечно, решается элементарно, но не красиво, т.к. приходится вводить доп. анализы, анализируя первый ли раз выполняется задача после перезагрузки. А состоит она в том, чтобы вести лог факта переключения состояния переключателя "есть/нет", состояние которого, естественно, неизвестно до первого выполнения задачи.
Еще раз спасибо.

есть пару слов в nncron, которые выполняются перед загрузкой табов и после:
BeforeCrontabLoading
AfterCrontabLoading

можно поместить их в nncron.ini, переопределить и использовать.
например:
Code: Select all
: BeforeCrontabLoading TMSG: "Загрузка табов началась" 5 BeforeCrontabLoading ;
: AfterCrontabLoading TMSG: "Загрузка табов закончилась" 5 AfterCrontabLoading ;

P.S.
если с помощью них инициализировать переменные, не забудь перед этим эти переменные создать
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Как запустить задачу только при загрузке кронтаба?

Postby dothen » Sat, 28 Mar 2015, 16:31

Слепил вот такую конструкцию.
Задача выполняется при каждом перечитывании кронтабов.

Code: Select all
<% 0 VALUE flg %>

#( CLASSIC-TASK-#-init_flg
NoActive
Action:
FILE-EXIST: "c:\WINDOWS\NOTEPAD.EXE"
TO flg
MSG: %flg%
)#

<% CLASSIC-TASK-#-init_flg RUN %>
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Как запустить задачу только при загрузке кронтаба?

Postby VoidVolker » Sun, 29 Mar 2015, 20:42

Code: Select all
<%
<любой код, который надо выполнить при перечитывании кронтаба>
%>

Т.о. образом, задача сокращается до:
Code: Select all
<%
S" c:\WINDOWS\NOTEPAD.EXE" EXIST? N>S MsgBox
%>
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Как запустить задачу только при загрузке кронтаба?

Postby dothen » Mon, 30 Mar 2015, 02:24

VoidVolker wrote:
Code: Select all
<%
<любой код, который надо выполнить при перечитывании кронтаба>
%>

Не любой.
большинство предопределенных префиксных слов в nnCron предназначены для периода компиляции, а не периода исполнения.

Так не работает.
Code: Select all
<%
TMSG: "Раз два три!" 3
%>

Так работает.
Code: Select all
<%
: Раздватри TMSG: "Раз два три!" 3 ;
Раздватри
%>
# или так
<%
S" Hello, world!" 3 TimeMsgBox
%>
# или так
#( CLASSIC-TASK-#-every_crontab_reload
NoActive
Action: TMSG: "Перечитал кронтабы!" 3
)#
<% CLASSIC-TASK-#-every_crontab_reload RUN %>

Так как я нигде не нашел простой способ запуска задачи при перечитывании кронтабов, то пришлось самому изобретать велосипед :)

В справке написано:
Совместное использование опций RunOnce и NoDel позволяет запускать задачу при каждом перечитывании кронтаба.

Да, но не сразу при перечитывании, а только в начале "новой" минуты, даже если перечитать "вручную".
А <% так RUN %> задача запускается сразу при перечитывании кронтабов.

А вот если так перечитать кронтабы, то никакой способ запуска задачи не срабатывает :(
Code: Select all
nncron.exe -reload
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Как запустить задачу только при загрузке кронтаба?

Postby Morituruz » Mon, 30 Mar 2015, 10:41

dothen wrote:nncron.exe -reload

Настоящее перечитывание кронтаба похоже происходит только при изменении времени файла, см. здесь:
viewtopic.php?f=5&t=13078

Так же неплохо в конце кронтаба поставить это (нужен osd.spf), чтобы видеть эти моменты перечитывания:
Code: Select all
<%
S" Verdana" 50 0xFF5555 OSD-FONT
100 100 OSD-POS
CR " %YYYY%.%MM%.%DD% %hh%:%mm%:%ss% Crontabs loaded" EVAL-SUBST 2DUP OSD TYPE CR
500 PAUSE
OSD-CLEAR
%>
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Как запустить задачу только при загрузке кронтаба?

Postby VoidVolker » Mon, 30 Mar 2015, 20:55

dothen wrote:Не любой.

Любой. Там же написано русским языком "надо выполнить". Впрочем, можно и скомпилировать - никто не запрещает. Это назвывается режим компиляции и режим интерпретации. Есть слова, которые только для режима компиляции. Эти слова только для режима компиляции надо применять только в режиме компиляции - это и указано в мануале. Между <% %>, а также между #( и Action: - режим интерпретации. После Action:, :, ], :NONAME - режим компиляции.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Как запустить задачу только при загрузке кронтаба?

Postby dothen » Wed, 01 Apr 2015, 18:40

Morituruz wrote:Так же неплохо в конце кронтаба поставить это (нужен osd.spf), чтобы видеть эти моменты перечитывания:
Code: Select all
<%
S" Verdana" 50 0xFF5555 OSD-FONT
100 100 OSD-POS
CR " %YYYY%.%MM%.%DD% %hh%:%mm%:%ss% Crontabs loaded" EVAL-SUBST 2DUP OSD TYPE CR
500 PAUSE
OSD-CLEAR
%>

Да, я сделал так.
В конце каждого кронтаба добавил вывод на консоль.
Code: Select all
<%
CR " %FT-CUR FT>DD.MM.YYYY/hh:mm:ss% <Crontab> loaded" TYPE CR
%>

А в конце последнего (в nncron.ini) кронтаба добавил это.
Code: Select all
<%
S" Verdana" 50 0xFF5555 OSD-FONT
100 100 OSD-POS
CR " %FT-CUR FT>DD.MM.YYYY/hh:mm:ss% Crontabs loaded" 2DUP OSD TYPE CR
500 PAUSE
OSD-CLEAR
%>
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 4 guests