Помогите пожалуйста, вылетает nncron

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

Re: Помогите пожалуйста, вылетает nncron

Postby makrus » Wed, 04 Aug 2010, 10:48

Serg1_cv
стоит START-APPW и вовсе не по ошибке
;) я не утверждал что это слово может стоять только по ошибке, просто использовал для описания ситуации (одной из многих :) ) когда по этому логу можно сделать неправильные выводы если не делать дополнительных проверок.
то есть процесс gettemper.exe не накапливается и в диспетчере задач он не висит
Ок :)
да и задача єтого процесса отработать и вернуть данные в текстовый файл он и отрабатывает то секунды 2
теоретически, наверное, любая программа подвиснуть может, и помимо запуска приложения в задаче еще много чего может быть (я же не вижу всего текста задачи) на чем возможно зависание текущего потока nnCron'а, поэтому добавления таких строчек в начало и конец задачи очень полезно особенно на момент отладки/отлова ошибки. Добавил - хорошо, хуже от этого точно не будет, а помочь очень даже может.
Судя по логу самого крона, то не приходится, но на вский случай я добавил выше указанные строки для каждой задачи
Ок, тоже хорошо.
Эксперимент провел, крон загружается за 2 секунды, но не факт что за эти же две секунды все происходит во время вылета крона, то есть он вылетает, там же идут записи в системны журналы винды, а потом срабатывает непотопляемый режим.
Во, даже за 2 а не за 30-ть..., во время вылета nnCron'а, вряд ли время значительно больше, imho, ну еще 2-3 секунды, ну максимум те же 30 сек и то за счет "активизации" винды по факту отлова зависшего процесса и решения "как же его похоронить" :) .
Возможен, конечно, вариант когда подвисший nnCron начинает "пожирать" все процессорное время..., а если у него еще повышенный (наивысший) приоритет оказался, то там конечно счет пойдет уже не на секунды.

так что по поводу 19-ой минуты пока никаких предположений, кроме того как в 19 минуту он и вывалился (завис или я не знаю что еще ) а в системных журналах уже отобразилось время его истинного вываливания и перезапуска то есть 20-я минута
Ну да, это остается пока тайной, может как-то так и было.

Убрал
Ок.
Теперь ждемс, по твоим данным такие вылеты nnCron'а где раз в 1.5-2 суток происходят, так что долго ждать, наверное, не прийдется. ;)
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Wed, 04 Aug 2010, 11:00

ну вот вчера например не вылетал, может потому что я часто терминалкой на машину заходил, создается такое впечатление, что как у Wyz крон вылетает, когда станцию с блокировки снимаешь, я уже боюсь на что-то грешить, но что-то тут явно не то и очень хотелось бы разобраться
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby makrus » Wed, 04 Aug 2010, 11:57

Serg1_cv
я уже боюсь на что-то грешить, но что-то тут явно не то
Вот вот ;) дабы не брать грех на душу и не обвинять nnCron в незнамо чем, надо сначала точно найти в чем его можно обвинить и уж затем :axe:
:)

и очень хотелось бы разобраться
аналогично, так же и Николай, imho тоже сделает (как и прежде) все возможное что бы устранить какие бы то ни было ошибки и неудобства в работе nnCron'а. Но у него тоже не 48 часов в сутках, поэтому надо помочь ему чем сможем, хотя бы в точной локализации ошибки, если она есть...

но что-то тут явно не то
угу, осталось определить "тут" это где? ;)
Зачему, что у меня и последний релиз и 10-ая бета работает с задачами которые запускаются ежеминутно (особенно у релиза их много), и компы регулярно находятся в залоченном состоянии и с подобным я вроде не сталкивался. Правда на XP.
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Wed, 04 Aug 2010, 12:31

Выкладываю текст задачи, которая делается раз в минуту может я где то ошибся и поэтому крон вылетает:
Code: Select all
#( Temp_history
\ NoActive
RunMissed
HyperActive
AsLoggedUser
SingleInstance
LoadProfile
Time: * * * * * *
0 VALUE NUMBER_OF_FILES
Action:
SEM1 GET
S" НАЧАЛО задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
HINT-OFF
\ Проверка существования в памяти процесса srv_t.exe (добавлено 30/08/2009)
PROC-EXIST: srv_t.exe NOT
IF
\ Запись в файл ошибок для сбора статистики вылетов программы
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% Не запущен процесс srv_t.exe %crlf%" EVAL-SUBST S" .\temp\error" FAPPEND
\ Остановка службы TEMPER
SWHide   NormalPriority
START-APPW: net stop TEMPER
\ Пауза 5 сек
5000 PAUSE
\ Запуск службы TEMPER
SWHide   NormalPriority
START-APPW: net start TEMPER
\ Проверка наличия процесса srv_t.exe после запуска службы TEMPER
PROC-EXIST: srv_t.exe
IF
\ Если есть то отсылаем сообщение об успешном запуске службы
SWHide   NormalPriority
StartIn: "C:\Program Files\nnCron\Postie\"
START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Служба TEMPER была успешно перезапущена%QUOTE%"
\ затем удаляем флаги
FOR-FILES: ".\flag_tem*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
\ Если нет то 
ELSE
0 TO NUMBER_OF_FILES
\ подсчитываем количество флагов об отсылке сообщения
FOR-FILES: ".\flag_tem*"
   NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
;FOR-FILES
\ если флагов меньше 3 то
NUMBER_OF_FILES 3 <
  IF
\ создаем флаг об отсылке собщения
   S" %mm%" EVAL-SUBST S" .\flag_tem%mm%" EVAL-SUBST FWRITE
   SWHide   NormalPriority
   StartIn: "C:\Program Files\nnCron\Postie\"
\ отсылаем сообщение
   START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Не удалось запустить службу TEMPER попробуем еще Не удалось запустить службу TEMPER попробуем еще %3 NUMBER_OF_FILES -% раз%QUOTE%"
  THEN
THEN
ELSE
\ если служба TEMPER существует то удаляем флаги отправки сообщения при их наличии
FOR-FILES: ".\flag_tem*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
THEN
\ Окончание проверки существования в памяти процесса srv_t.exe (добавлено 30/08/2009)
SWHide   NormalPriority
StartIn: "C:\Program Files\nnCron\"
START-APPW: gettemper.exe xx.xx.x.xxx 65001 komun street
START-APPW: gettemper.exe xx.xx.x.xxx 65001 server1 server2

FILE-EMPTY: "street" NOT
IF
GET-CUR-TIME
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: street% %crlf%" EVAL-SUBST S" .\temp\his_street" FAPPEND
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% Зовні:            %FILE: street% %crlf%" EVAL-SUBST S" .\temper" FAPPEND
S" street" FDELETE
GET-CUR-TIME
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: komun% %crlf%" EVAL-SUBST S" .\temp\his_komun" FAPPEND
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% АТС:              %FILE: komun% %crlf%" EVAL-SUBST S" .\temper" FAPPEND
\ порог для температуры в коммуникационной 25 градусов
S" %FILE: komun%" EVAL-SUBST S>NUM 25 >
IF
0 TO NUMBER_OF_FILES
FOR-FILES: ".\alarm_komun*"
   NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
;FOR-FILES
\ сообщение не более 3 раз
NUMBER_OF_FILES 3 <
  IF
  GET-CUR-TIME
  S" %mm%" EVAL-SUBST S" .\alarm_komun%mm%" EVAL-SUBST FWRITE
  S" Создание флага  .\alarm_komun%mm%" EVAL-SUBST CRON-LOG
\  MSG: "Температура в комуникационной %FILE: komun%"
   SWHide   NormalPriority
   StartIn: "C:\Program Files\nnCron\Postie\"
   START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Температура в комуникационной %FILE: komun%%QUOTE%"
  THEN
ELSE
FOR-FILES: ".\alarm_komun*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
THEN
S" komun" FDELETE

FOR-FILES: ".\flag_str*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
ELSE
0 TO NUMBER_OF_FILES
FOR-FILES: ".\flag_str*"
   NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
;FOR-FILES
NUMBER_OF_FILES 3 <
  IF
   GET-CUR-TIME
   S" %mm%" EVAL-SUBST S" .\flag_str%mm%" EVAL-SUBST FWRITE
   S" Создание флага  .\flag_str%mm%" EVAL-SUBST CRON-LOG
   SWHide   NormalPriority
   StartIn: "C:\Program Files\nnCron\Postie\"
   START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Не возможно получить температуру на улице и в комуникационной.Включите службу TEMPER на xx.xx.x.xxx%QUOTE%"
  THEN
THEN

FILE-EMPTY: "server2" NOT
IF
GET-CUR-TIME
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: server2% %crlf%" EVAL-SUBST S" .\temp\his_arm" FAPPEND
\ порог для температуры в серверной 25 градусов
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% АРМ-НБУ: %FILE: server2%%crlf%" EVAL-SUBST S" .\temper" FAPPEND
S" %FILE: server2%" EVAL-SUBST S>NUM 25 >
IF
0 TO NUMBER_OF_FILES
FOR-FILES: ".\alarm_arm*"
   NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
;FOR-FILES
\ сообщение не более 3 раз
NUMBER_OF_FILES 3 <
  IF
  GET-CUR-TIME
  S" %mm%" EVAL-SUBST S" .\alarm_arm%mm%" EVAL-SUBST FWRITE
  S" Создание флага  .\alarm_arm%mm%" EVAL-SUBST CRON-LOG
\  MSG: "Температура в серверной %FILE: server2%"
   SWHide   NormalPriority
   StartIn: "C:\Program Files\nnCron\Postie\"
   START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Температура в АРМ-НБУ %FILE: server2%%QUOTE%"
  THEN
ELSE
FOR-FILES: ".\alarm_arm*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
THEN
S" server2" FDELETE

GET-CUR-TIME
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: server1% %crlf%" EVAL-SUBST S" .\temp\his_ser" FAPPEND
\ порог для температуры в ARM-NBU 25 градусов
S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% Серверна: %FILE: server1%%crlf%" EVAL-SUBST S" .\temper" FAPPEND
S" %FILE: server1%" EVAL-SUBST S>NUM 26 >
IF
0 TO NUMBER_OF_FILES
FOR-FILES: ".\alarm_ser*"
   NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
;FOR-FILES
\ сообщение не более 3 раз
NUMBER_OF_FILES 3 <
  IF
  GET-CUR-TIME
  S" %mm%" EVAL-SUBST S" .\alarm_ser%mm%" EVAL-SUBST FWRITE
  S" Создание флага  .\alarm_ser%mm%" EVAL-SUBST CRON-LOG
\  MSG: "Температура в серверной %FILE: server1%"
   SWHide   NormalPriority
   StartIn: "C:\Program Files\nnCron\Postie\"
   START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Температура в серверной %FILE: server1%%QUOTE%"
  THEN
ELSE
FOR-FILES: ".\alarm_ser*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
THEN
S" server1" FDELETE

FOR-FILES: ".\flag_ser*"
    FILE-DELETE: "%FOUND-FULLPATH%"
;FOR-FILES
ELSE
0 TO NUMBER_OF_FILES
FOR-FILES: ".\flag_ser*"
   NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
;FOR-FILES
NUMBER_OF_FILES 3 <
  IF
   GET-CUR-TIME
   S" %mm%" EVAL-SUBST S" .\flag_ser%mm%" EVAL-SUBST FWRITE
   S" Создание флага  .\flag_ser%mm%" EVAL-SUBST CRON-LOG
   SWHide   NormalPriority
   StartIn: "C:\Program Files\nnCron\Postie\"
   START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Не возможно получить температуру в серверной.Включите службу TEMPER на xx.xx.x.xxx%QUOTE%"
  THEN
THEN
HINT: "%FILE: temper%"
S" .\temper" FDELETE
SEM1 RELEASE
S" КОНЕЦ задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
)#

Задача большая потому что куча проверок :)
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Thu, 05 Aug 2010, 11:07

итак, крон вылетел 04/08/2010 в 22:50, вот протокол работы программы:

22:47:00 10836 НАЧАЛО задачи Temp_history
22:47:00 10836 Start: gettemper.exe xx.xx.x.xxx 65001 komun street
22:47:00 10836 Start result: 0
22:47:00 10836 Start: gettemper.exe xx.xx.x.xxx 65001 server1 server2
22:47:00 10836 Start result: 0
22:47:00 10836 КОНЕЦ задачи Temp_history
22:48:00 8332 TASK: Temp_history
22:48:00 8332 НАЧАЛО задачи Temp_history
22:48:00 8332 Start: gettemper.exe xx.xx.x.xxx 65001 komun street
22:48:00 8332 Start result: 0
22:48:00 8332 Start: gettemper.exe xx.xx.x.xxx 65001 server1 server2
22:48:01 8332 Start result: 0
22:48:01 8332 КОНЕЦ задачи Temp_history
22:50:33 9364 Start nnCron
22:50:33 9364 Load crontab
22:50:33 9364 C:\Program Files\nnCron\nncron.tab
22:50:33 4900 TASK: Temp_history
22:50:33 4900 НАЧАЛО задачи Temp_history
22:50:33 4900 Start: gettemper.exe xx.xx.x.xxx 65001 komun street
22:50:33 4900 Start result: 0
22:50:33 4900 Start: gettemper.exe xx.xx.x.xxx 65001 server1 server2
22:50:34 4900 Start result: 0
22:50:34 4900 КОНЕЦ задачи Temp_history

Снова вылетела 49 минута, я подозреваю такое, что на 49 минуте когда должна была запуститься задача Temp_history, то ей не хватило системных семафоров, поэтому она и не запустилась, а крон вылетел потому что получил сигнал об ошибке и в 22:50 запустился.
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby makrus » Thu, 05 Aug 2010, 14:24

Serg1_cv
Снова вылетела 49 минута, я подозреваю такое, что на 49 минуте когда должна была запуститься задача Temp_history, то ей не хватило системных семафоров, поэтому она и не запустилась...

Да, наверное не спроста эти "х9" минуты.
Точно больше никакие задачи в это время не должны были запуститься?
Остальные задачи у тебя запускаются по времени или по событию?

Может быть все-таки попробовать запускать эту задачу отдельным потоком?


Выкладываю текст задачи...

Ниже некоторые непонятные для меня вопросы которые надо бы уточнить и, может быть, исправить:

1. В начале задачи закрываем подсказку с помощью HINT-OFF - подсказку от предыдущего запуска этой задачи или какой-то другой?
2. При использовании PROC-EXIST: имя процесса должно находиться в кавычках, надо бы исправить в двух местах.
3. Служба TEMPER при своем запуске запускает процесс srv_t.exe?
4. IMHO усложненное использование переменной NUMBER_OF_FILES. Ты ее используешь для подсчета кол-ва раз отправки письма, и при отправке письма ты создаешь спецфайл, потом подсчитываешь кол-во файлов и это значение у тебя хранится в переменной. А если обойтись без файлов, а при отправке письма увеличивать значение в переменной на 1-цу и все?
Или я где-то чего-то не понял?
5. Всю задачу у тебя укрупненно можно разделить на 3 части: 1 - проверка работы служб/процессов, 2 - получение данных по температуре в одном помещении, 3 - получение данных по температуре в другом помещении. Части 2 и 3 напрашиваются что бы сделать универсальное слово которому передаются через стек/переменные данные и вызывается это слово в каждой части со своими параметрами. Так же отправка сообщения просится в отдельное слово, не говоря уж о том что можно отправлять самими nnCron'ом без использования другой программы. IMHO, это сделает задачу более читабельной, да и места займет чуть меньше... ну в общем, "нет предела совершенству" :)
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Помогите пожалуйста, вылетает nncron

Postby elos » Thu, 05 Aug 2010, 15:50

Можно словами выразить, что должна делать задача?
А то такая "портянка" по длине, что теряешься в структуре , пока к концу просматриваешь, не говоря уже о том, что после чтения 3-ёх страниц темы окончательно теряешь понимание происходящего. Пришлось минут 10 просто форматировать IF-структуры, чтобы что-то понять не вдаваясь в логику наконец-то представленной задачи.

Не вдаваясь в логику и просто смотря на некоторые "косвенные" признаки...
Зачем семафор применён? У нас есть ещё ДРУГАЯ задача, которая не должна работать одновременно с этой? И зачем так часто запускать задачу - чтобы использовать SingleInstance?

SingleInstance
Предотвращает одновременное выполнение двух и более экземпляров одной задачи. Пока задача с опцией SingleInstance выполняется, ни один следующий экземпляр этой же задачи не сможет стартовать - попытка его запуска будет пресечена.

Предотвратить одновременный запуск нескольких разных задач (как, впрочем, и разных экземпляров одной задачи) можно с помощью слов GET и RELEASE.
Уже одно употребение семафора вызывает подозрение, что что-то не было досказано. Так что словами опишите нам, что вам надо получить.

И, опять не вдаваясь в логику программы, такое впечатление, что вы собираетесь себя просто завалить письмами. Знаю одного человека, написал что-то подобное - теперь просто уже не обращает внимания на эти письма. Приходилось звонить с сообщением "поломалося"... Давайте придумаем что-то при минимуме писем.

Так как сервисы, они же службы, по идее должны перезапускаться самой виндой, то зачем проверять наличие процесса? Может, проще ждать его завершения (WatchProcStop: "proc_pattern")? Типа:
Code: Select all
#( socrat_up
AsLoggedUser
WatchProcStop: "C:\Socrat\spv.exe"
Rule: PROC-EXIST: "C:\Socrat\spv.exe" NOT
Action:
StartIn: "C:\Socrat"
ShowNormal   NormalPriority
START-APP: C:\Socrat\spv.exe
)#

Потому начнём сначала, условившись, что падения крона происходят из-за этой конкретно задачи, и начнём с устной постановки задачи... (просто легче заново написать, чем по жаре разбираться).

И осмелюсь выложить ваш же, но отформатированный для лучшего понимания, код (смотреть лучше в стороннем редакторе):
Code: Select all
#( Temp_history
\ NoActive
RunMissed
HyperActive
AsLoggedUser
SingleInstance
LoadProfile
Time: * * * * * *
0 VALUE NUMBER_OF_FILES
Action:
SEM1 GET
S" НАЧАЛО задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
HINT-OFF

\ Проверка существования в памяти процесса srv_t.exe (добавлено 30/08/2009)
PROC-EXIST: "srv_t.exe" NOT
IF
  \ Запись в файл ошибок для сбора статистики вылетов программы
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% Не запущен процесс srv_t.exe %crlf%" EVAL-SUBST S" .\temp\error" FAPPEND
  \ Остановка службы TEMPER
  SWHide   NormalPriority
  START-APPW: net stop TEMPER
  \ Пауза 5 сек
  5000 PAUSE
  \ Запуск службы TEMPER
  SWHide   NormalPriority
  START-APPW: net start TEMPER
  \ Проверка наличия процесса srv_t.exe после запуска службы TEMPER
  PROC-EXIST: "srv_t.exe"
    IF
      \ Если есть то отсылаем сообщение об успешном запуске службы
      SWHide   NormalPriority
      StartIn: "C:\Program Files\nnCron\Postie\"
      START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Служба TEMPER была успешно перезапущена%QUOTE%"
      \ затем удаляем флаги
      FOR-FILES: ".\flag_tem*"
          FILE-DELETE: "%FOUND-FULLPATH%"
      ;FOR-FILES
      \ Если процесса srv_t.exe нет, то
    ELSE
      0 TO NUMBER_OF_FILES
      \ подсчитываем количество флагов об отсылке сообщения
      FOR-FILES: ".\flag_tem*"
         NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
      ;FOR-FILES
      \ если флагов меньше 3 то
      NUMBER_OF_FILES 3 <
        IF
        \ создаем флаг об отсылке собщения
         S" %mm%" EVAL-SUBST S" .\flag_tem%mm%" EVAL-SUBST FWRITE
         SWHide   NormalPriority
         StartIn: "C:\Program Files\nnCron\Postie\"
        \ отсылаем сообщение
         START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Не удалось запустить службу TEMPER попробуем еще Не удалось запустить службу TEMPER попробуем еще %3 NUMBER_OF_FILES -% раз%QUOTE%"
        THEN
    THEN
ELSE
  \ если служба TEMPER существует то удаляем флаги отправки сообщения при их наличии
  FOR-FILES: ".\flag_tem*"
      FILE-DELETE: "%FOUND-FULLPATH%"
  ;FOR-FILES
THEN
\ ___________________________________________________________________________________
\ Окончание проверки существования в памяти процесса srv_t.exe (добавлено 30/08/2009)
SWHide   NormalPriority
StartIn: "C:\Program Files\nnCron\"
START-APPW: gettemper.exe xx.xx.x.xxx 65001 komun street
START-APPW: gettemper.exe xx.xx.x.xxx 65001 server1 server2

FILE-EMPTY: "street" NOT
IF
  GET-CUR-TIME
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: street% %crlf%" EVAL-SUBST S" .\temp\his_street" FAPPEND
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% Зовн_:            %FILE: street% %crlf%" EVAL-SUBST S" .\temper" FAPPEND
  S" street" FDELETE
  GET-CUR-TIME
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: komun% %crlf%" EVAL-SUBST S" .\temp\his_komun" FAPPEND
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% АТС:              %FILE: komun% %crlf%" EVAL-SUBST S" .\temper" FAPPEND
  \ порог для температуры в коммуникационной 25 градусов
  S" %FILE: komun%" EVAL-SUBST S>NUM 25 >
    IF
      0 TO NUMBER_OF_FILES
      FOR-FILES: ".\alarm_komun*"
         NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
      ;FOR-FILES
      \ сообщение не более 3 раз
      NUMBER_OF_FILES 3 <
        IF
          GET-CUR-TIME
          S" %mm%" EVAL-SUBST S" .\alarm_komun%mm%" EVAL-SUBST FWRITE
          S" Создание флага  .\alarm_komun%mm%" EVAL-SUBST CRON-LOG
        \  MSG: "Температура в комуникационной %FILE: komun%"
           SWHide   NormalPriority
           StartIn: "C:\Program Files\nnCron\Postie\"
           START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Температура в комуникационной %FILE: komun%%QUOTE%"
        THEN
    ELSE
      FOR-FILES: ".\alarm_komun*"
          FILE-DELETE: "%FOUND-FULLPATH%"
      ;FOR-FILES
    THEN
  S" komun" FDELETE

  FOR-FILES: ".\flag_str*"
      FILE-DELETE: "%FOUND-FULLPATH%"
  ;FOR-FILES
ELSE
  0 TO NUMBER_OF_FILES
  FOR-FILES: ".\flag_str*"
     NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
  ;FOR-FILES
  NUMBER_OF_FILES 3 <
    IF
      GET-CUR-TIME
      S" %mm%" EVAL-SUBST S" .\flag_str%mm%" EVAL-SUBST FWRITE
      S" Создание флага  .\flag_str%mm%" EVAL-SUBST CRON-LOG
      SWHide   NormalPriority
      StartIn: "C:\Program Files\nnCron\Postie\"
      START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Не возможно получить температуру на улице и в комуникационной.Включите службу TEMPER на xx.xx.x.xxx%QUOTE%"
    THEN
THEN
\ ___________________________________________________________________________________
FILE-EMPTY: "server2" NOT
IF
  GET-CUR-TIME
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: server2% %crlf%" EVAL-SUBST S" .\temp\his_arm" FAPPEND
  \ порог для температуры в серверной 25 градусов
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% АРМ-НБУ: %FILE: server2%%crlf%" EVAL-SUBST S" .\temper" FAPPEND
  S" %FILE: server2%" EVAL-SUBST S>NUM 25 >
  IF
    0 TO NUMBER_OF_FILES
    FOR-FILES: ".\alarm_arm*"
       NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
    ;FOR-FILES
    \ сообщение не более 3 раз
    NUMBER_OF_FILES 3 <
      IF
        GET-CUR-TIME
        S" %mm%" EVAL-SUBST S" .\alarm_arm%mm%" EVAL-SUBST FWRITE
        S" Создание флага  .\alarm_arm%mm%" EVAL-SUBST CRON-LOG
        \ MSG: "Температура в серверной %FILE: server2%"
        SWHide   NormalPriority
        StartIn: "C:\Program Files\nnCron\Postie\"
        START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Температура в АРМ-НБУ %FILE: server2%%QUOTE%"
      THEN
  ELSE
    FOR-FILES: ".\alarm_arm*"
        FILE-DELETE: "%FOUND-FULLPATH%"
    ;FOR-FILES
  THEN
  S" server2" FDELETE

  GET-CUR-TIME
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% %FILE: server1% %crlf%" EVAL-SUBST S" .\temp\his_ser" FAPPEND
  \ порог для температуры в ARM-NBU 25 градусов
  S" %YYYY%/%MM%/%DD% %hh%:%mm%:%ss% Серверна: %FILE: server1%%crlf%" EVAL-SUBST S" .\temper" FAPPEND
  S" %FILE: server1%" EVAL-SUBST S>NUM 26 >
  IF
    0 TO NUMBER_OF_FILES
    FOR-FILES: ".\alarm_ser*"
       NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
    ;FOR-FILES
    \ сообщение не более 3 раз
    NUMBER_OF_FILES 3 <
      IF
        GET-CUR-TIME
        S" %mm%" EVAL-SUBST S" .\alarm_ser%mm%" EVAL-SUBST FWRITE
        S" Создание флага  .\alarm_ser%mm%" EVAL-SUBST CRON-LOG
        \ MSG: "Температура в серверной %FILE: server1%"
        SWHide   NormalPriority
        StartIn: "C:\Program Files\nnCron\Postie\"
        START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Температура в серверной %FILE: server1%%QUOTE%"
      THEN
  ELSE
    FOR-FILES: ".\alarm_ser*"
        FILE-DELETE: "%FOUND-FULLPATH%"
    ;FOR-FILES
  THEN
  S" server1" FDELETE

  FOR-FILES: ".\flag_ser*"
      FILE-DELETE: "%FOUND-FULLPATH%"
  ;FOR-FILES

ELSE
  0 TO NUMBER_OF_FILES
  FOR-FILES: ".\flag_ser*"
     NUMBER_OF_FILES 1 + TO NUMBER_OF_FILES
  ;FOR-FILES
  NUMBER_OF_FILES 3 <
  IF
    GET-CUR-TIME
    S" %mm%" EVAL-SUBST S" .\flag_ser%mm%" EVAL-SUBST FWRITE
    S" Создание флага  .\flag_ser%mm%" EVAL-SUBST CRON-LOG
    SWHide   NormalPriority
    StartIn: "C:\Program Files\nnCron\Postie\"
    START-APPW: "POSTIE.EXE -config:.\temper.txt -msg:%QUOTE%Не возможно получить температуру в серверной.Включите службу TEMPER на xx.xx.x.xxx%QUOTE%"
  THEN
THEN
HINT: "%FILE: temper%"
S" .\temper" FDELETE
SEM1 RELEASE
S" КОНЕЦ задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
)#

Передача письма кроном, на мой взгляд, "утяжелит" понимание кода. А вот употребление внешней почтовой программы с вынесением внешних для нее параметров в SET-переменные упростит понимание алгоритма.

О! Сейчас зацепило:
добавлено 30/08/2009
А что вначале то было? А с какого момента тогда начало падать? Что делалось то? Задача перенесена с одной версии крона на другую? Или что-то было добавлено в какой-то момент? Давайте-ка к осмотру ещё и nncron.ini... Сколько по времени отрабатывает gettemper.exe? Обрамить код запуска каждого gettemper.exe логированием и посмотреть.

А ещё разнести эту задачу на три разных задачи. За сервисом пусть одна смотрит. За температурой - две другие (вот тут можно и период времени установить, только не минуту...) Заодно решим проблему длины "портянок" в кодировании и разрешим понимание логики отдельно взятых задач.

Ещё (вроде) попадалось, что иногда помогает вынесение задачи в отдельный таб.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Thu, 05 Aug 2010, 18:12

Задача делает вот что :
задача опрашивает температуру в четырех комнатах, если температура превышает порог то отправляется письмо по электронной почте, кроме того задача следит запущена ли служба к которой обращается утилита gettemper, кроме того задача следит за тем чтоб при увеличении порога отправлять не более трех писем. Опрашивает температуру раз в минуту (здесь ведь никаких нарушений технологии нет) так нужно для статистики. А семафор использую для того чтоб данная задача не выполнялась выполнялась совместно с другими или другие задачи не выполнялись совместно с данной. Я во всех своих задачах использую SEM1 GET и SEM1 RELEASE так как заинтересован в последовательном выполнении задач и никак не в параллельном.
такое впечатление, что вы собираетесь себя просто завалить письмами.

Задача у меня реально работает, и вовсе письмами не заваливает
О! Сейчас зацепило:

до 03/08/2009 просто не проверялось наличие процесса srv_t.exe, жизнь заставила добавить, так мало ли что...
И еще, я не думаю что крон вылетает именно из-за этой задачи, уверен что если вместо этой задачи будет выполняться каждую минуту такой код :
Code: Select all
 Action:
S" НАЧАЛО задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
S" КОНЕЦ задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG

то крон все равно будет вылетать
да и потом, нельзя решать так что крон вылетает именно из-за этой задачи, так как эта задача по логу крона выполняется успешно, так крон вылетал 02/08/ в 12-20, а потом 04/08 в 22-50, за этот период задача выполнилась 3507 раз успешно на 3508 разе вылетела, на других машинах у меня другие задачи, и тоже крон вылетает с такой же ошибкой
Согласен, может во всем виноваты SEM1 GET и SEM1 RELEASE может эти слова где-то не отрабатывают, но опять же на этот вопрос может ответить только разработчик.
Возможно кто-то сможет подсказать как с помощью какого-либо слова вычислить количество открытых семафоров системных
да и просто при из изрядном количестве перестартовывать крон из задачи
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby elos » Thu, 05 Aug 2010, 20:07

А переменная семафора где объявлена (только сейчас углядел)?

Вспомним код из help
Code: Select all
#( test_task1
\ Сообщения "task1" и "task2" никогда не появятся одновременно.
VARIABLE SEM1
Action:
    SEM1 GET
    MSG: "task1"
    SEM1 RELEASE
)#

#( test_task2
Action:
    SEM1 GET
    MSG: "task2"
    SEM1 RELEASE
)#

Пока же могу сказать, что здесь реализована разновидность светофора - так называемый мьютех ( http://ru.wikipedia.org/wiki/Мьютекс ), код которого можно посмотреть в ~nn\lib\mutex.f.

Так где у нас в задаче объявление VARIABLE SEM1? Если оно где-то и есть, то мы то этого не видим - где, отключалось ли оно в какие-то моменты... Я бы внимательно смотрел логи крона - вдруг где проскакивает сообщение об этой переменной.

И на всякий случай я бы ещё деинсталировал и ещё раз запустил сервис крона как самый крайний вариант, или перезагрузка машины - как более предпочтительный. Была у меня запара с анализом строк... Такую ерунду выдавало в простейшем коде - пока не перезагрузился. Код сразу заработал нормально. Сделал вывод, что в памяти что-то как-то копилось - но так и не понял тогда где мог путаться. Интерпретатор никаких ошибок в синтаксисе так и не показывал.

В остальном своё мнение навязывать не буду насчёт множественного употребления семафора для последовательного выполнения задач , но вот что-то лично мне не по себе эта ситуация такого применения. Можно нарваться на "просрочку" выполнения некоей задачи из-за занятости семафора. Уж лучше последовательную цепочку формировать из последовательного же запуска задач с помощью LAUNCH или RUN.

И семафор - это просто ячейка памяти. Один раз где-то объявленная (в кроне в частности) и затем просто проверяемая на некое значение. Читаем про клинч и пугаемся...
Отладка взаимных блокировок, как и других ошибок синхронизации, усложняется тем, что для их возникновения нужны специфические условия одновременного выполнения нескольких процессов (в вышеописанном примере если бы процесс 1 успел захватить ресурс B до процесса 2, то ошибка не произошла бы).
После этого остаётся только рассуждать о переделке алгоритма.

VoidVolker wrote:Файл SPF.ERR говорит:
Code: Select all
100 Cannot create another system semaphore.  ERROR_TOO_MANY_SEMAPHORES


TOO MANY SEMAPHORES - СЛИШКОМ МНОГО СЕМАФОРОВ
Это ж-ж-ж неспроста. Наверно столько семафоров в задачах наобъявлено, что при (вот сейчас от балды пишу) перечитывании табов кроном он на каких-то анализах и спотыкается. Тут моих знаний не хватает.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Fri, 06 Aug 2010, 10:04

Так где у нас в задаче объявление VARIABLE SEM1? Если оно где-то и есть, то мы то этого не видим - где, отключалось ли оно в какие-то моменты... Я бы внимательно смотрел логи крона - вдруг где проскакивает сообщение об этой переменной.

переменная SEM1 объявлена в плагине bank.spf, который подключен через nncron.ini, так как она используется в нескольких задачах кронтаба, может действительно её объявить в начале кронтаба, типа так:
Code: Select all
<%
VARIABLE SEM1
%>

Итак, сделал следующие манипуляции:
1. Переменную SEM1 объявил не через spf файл, подключаемый в nncron.ini, а в самом начале кронтаба
2. На другой машине добавил тестовую задачу, выполняющуюся каждую минуту, без объявления семафоров:
Code: Select all
#( VEGA_FILES
RunMissed
HyperActive
AsLoggedUser
SingleInstance
LoadProfile
Time: * * * * * *
 Action:
S" НАЧАЛО задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
S" КОНЕЦ задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
)#

3. в spf файле на всех машинах заремарено объявление SEM1
на своей машине сделал точно так же, понаблюдаем на выходных, вылетит ли где крон.
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Tue, 10 Aug 2010, 11:45

Итак, дело не в задаче и не в семафорах, которые я открываю для предотвращения одновременного выполнения задач. Потому что на одной из машин в кроне было 3 задачи, которые выполнялись с периодичностью от 10 минут до 15 минут, крон на этой машине не вылетал, после того как я просто добавил задачу:
Code: Select all
#( VEGA_FILES
Time: * * * * * *
 Action:
S" НАЧАЛО задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
S" КОНЕЦ задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
)#

за выходные крон вылетел 2 раза
то есть задача выполнилась 2018 раз между вылетами
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby makrus » Tue, 10 Aug 2010, 12:44

Serg1_cv
Итак, дело не в задаче и не в семафорах...

Все больше похоже что дело, IMHO, в настройке винды...
Если есть время и главное желание исключить и эту вероятность, то установи с нуля обычную винду (не сборку, не с образа и т.д.) на комп, лучше конечно не в виртуальной среде, ничего не настраивай, не вводи в домен, к сети вообще не подключай, установи nnCron, добавь эту одну задачу и подожди пару дней, скорее всего для надежности надо будет ждать побольше, т.к. не должно быть вылетов из этой простой задачи, IMHO.
Если вылетов не будет, то постепенно, с шагом в 2 дня приводи винду к виду принятому у вас в домене и лови момент когда начнет вылетать... и так постепенно можно будет, наверное, отловить причину вылетов.
Это если на "девственной" винде будет все нормально.

К сожалению, другого выхода я не вижу, так что решай сам.
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Wed, 11 Aug 2010, 17:27

Итак, по вашим рекомендациям установил Windows XP SP3 с нуля, система полностью легальна. Антивирус отсутствует, к сети не подключена, в домен не вводилась. Установил nncron 1.93b10
задача
Code: Select all
#( VEGA_FILES
RunMissed
HyperActive
AsLoggedUser
SingleInstance
LoadProfile
WatchHotKey: ^{0xC0}
 Action:
S" НАЧАЛО задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
S" КОНЕЦ задачи %CUR-TASK-NAME%" EVAL-SUBST CRON-LOG
)#

по хоткею крон вылетает после приблизительно 700 раз, пробовал убрать SingleInstance, вылетел после 608 раз то есть дело не в SingleInstance.
ставлю по времени, буду наблюдать через сколько вылетет крон
в протоколах системы пишет по ошибке на этот раз такое:
Источник Service Control Manager
Категория Отсутствует
Код (ID) 7034
Тип Ошибка
Пользователь Н/Д
Компьютер TEST
Описание: Служба "nnCron" неожиданно прервана. Это произошло (раз): 4.
крон запущен как служба
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

Re: Помогите пожалуйста, вылетает nncron

Postby elos » Wed, 11 Aug 2010, 20:27

Не знаю что и сказать... Напоминает мои мучения.
Напоминает библиотеку написания help-системы в TurboPascal7. После вызова и отмены помощи всё повисало после нескольких циклов. В более профессиональной (объектной) версии паскаля ничего такого не было. В библиотеке поменяли местами только четыре строчки попарно. На мой взгляд никак влиять не должно было, но влияло!

Раз - HyperActive убери и посмотри. Этим на форуме практически никто "не светился", по-моему. Может это влияет в бете,
тем более крон запущен как служба. Вот когда автор в дистрибутив вставит запуск крона как сервиса по дефолту, тогда и будем этим пользоваться. То есть, два - запуск беты как приложения. Это, скорее, главное. Автор же неспроста рекомендует как приложение запускать(если не ошибаюсь). Если найдешь причину - поможешь автору.
Типа как на этом сайте.
Предлагается выполнять после ошибки (у меня её сейчас нет, это пример)
C:\Documents and Settings\elos>sc query nncron

SERVICE_NAME: nncron
TYPE : 110 WIN32_OWN_PROCESS (interactive)
STATE : 4 RUNNING
(STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

C:\Documents and Settings\elos>
Может в третьем сервис-паке принципы написания сервисов поменялись? А для крона использовалась старая наработка... Или в бете сервис по новому попробовали написать (под Vista/Win7)...
Попробуй ещё не бету крона, а стабильный релиз (1083) - три. Четыре - винда легальная. Это то, что лицензионный образ (типа MSDN)? Если чья-то сборка - в топку однозначно.

Похоже, "спасение утопающих - дело рук самих утопающих"... Не считая "криков" о помощи.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Помогите пожалуйста, вылетает nncron

Postby Serg1_cv » Thu, 12 Aug 2010, 11:16

Раз - HyperActive убрал, и что странное, без него крон вылетел с ошибкой 1000 как и описывалось выше
комманда sc query nncron дает:
SERVICE_NAME: nncron
TYPE : 110 WIN32_OWN_PROCESS (interactive)
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1067 (0x42b)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

Пробовал запускать крон как приложение, при этом видно, что крон перезапускается, при чем когда срабатывает непотопляемый режим крон теряет домашний каталог, хотя в startnncron.bat прописано -dir "c:\program files\nncron" видимо при срабатывании nnguard домашний каталог устанавливается по умолчанию. Так вот при запуске приложением ошибка остается, крон перезапускается, но при этом в логах системы ничего не пишется.
Стабильный релиз (1083) с теми же проблемами. Винда легальная не сборка, шла с компом от HP. Активировано по телефонному звонку в представительство Майкрософт
Serg1_cv
 
Posts: 151
Joined: Thu, 22 Mar 2007, 13:39
Location: Черновцы

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests

cron