Запуск задачи по "плавающему" времени

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

Запуск задачи по "плавающему" времени

Postby ruspad » Wed, 12 Dec 2012, 20:04

Всем привет!

Имеется парк машин ~ 270 шт. имена компьютеров определены по маске XX0001, XX0002 и т.д.
Все эти машины конектятся к одному серверу согласно задаче один раз в 1 час днем и 1 раз в 2 часа ночью.
Помогите, пожалуйста, реализовать возможность запуска задачи в зависимости от имени компьютера.
Я уже реализовал задачу где убираются первые 2 символа а последние 4 преобразовываю в число, далее умножаю полученное значение на 7.
таким образом получаю время задержки.
И в момент выполнения задачи скармлеваю как параметр приложению "sleep.exe" - все работает.
Кстати, почему-то слово "PAUSE:" не воспринимает полученное значение из переменной. =(

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

Также, никак не могу сообразить :Hangman: , как реализовать повторный коннект к серверу (например, раз в 5 минут) если в момент выполнения ответ (пинг) от сервера не получен.

Заранее спасибо, за помощь. =)
ruspad
 
Posts: 16
Joined: Mon, 05 Mar 2012, 16:12

Re: Запуск задачи по "плавающему" времени

Postby VoidVolker » Wed, 12 Dec 2012, 21:50

ruspad wrote:Кстати, почему-то слово "PAUSE:" не воспринимает полученное значение из переменной. =(

Code: Select all
VARIABLE name
name @ PAUSE

Code: Select all
123 VALUE name
name PAUSE


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

Re: Запуск задачи по "плавающему" времени

Postby ruspad » Thu, 13 Dec 2012, 08:18

хмм... спасибо, даже и не знал, что у слова PAUSE: есть постфиксная нотация. =)

Вот этим словом я получаю время задержки
Code: Select all
: time
S" %COMPUTERNAME%" EVAL-SUBST comp PLACE
comp COUNT 2 /STRING comp PLACE
S" %comp COUNT%" EVAL-SUBST S>NUM TO timewait
timewait 7 * TO timewait
;


Вот сама задача (все лишнее убрано):
Code: Select all
#( ftp
Time: 0 7-23/1
Time: 0 0-7/2
SingleInstance
Action:
SEM1 GET
FILE-EXIST: "ftp\ncftpget.exe"
\ Проверю наличие приложения ncftpget
IF
HOST-EXIST: "x.x.x.x"
\ Пингую сервер
IF
FILE-EXIST: "sleep.exe"
\ Проверяю наличие приложения sleep
IF time
SWHide
START-APPW: sleep.exe %timewait%
\ Скармлеваю sleep.exe полученый параметр %timewait%
\ вот этот колхоз мне очень очень и не нравиться  =(
ELSE
PAUSE: 5000
\ Выполняю паузу в случае если не найдено приложение sleep
THEN
SWHide
START-APPW: "ftp\ncftpget.exe" .....
ExitCodeProc
\ ....
\ Выполняю операции в зависимости от кода возврата.
\ ....
ELSE
\ Запись в лог что сервер не пингуется"
THEN
ELSE
\ Запись в лог что не найдено приложение ncftpget.exe
THEN
SEM1 RELEASE
)#


Было бы совсем прелестно если была возможность запуска задачи на уровне
Code: Select all
Time: 0 7-23/1
Time: 0 0-7/2

т.е. образно говоря в значение минут можно было подставить %timewait%.
Задача должна стартовать с учетом полученного значения задержки,
на данный момент у меня задержка выполняется уже в запущенной задаче, что мне очень не нравиться =/

Также если в процессе выполнения задачи например слово "HOST-EXIST: "x.x.x.x"" возвращает "FALSE" или еще какая нибудь ошибка при выполнении задачи то задача бы выполнялась повторно скажем каждые 5 минут вне зависимости от времени задержки.

Спасибо за любою помощь. =)
ruspad
 
Posts: 16
Joined: Mon, 05 Mar 2012, 16:12

Re: Запуск задачи по "плавающему" времени

Postby Morituruz » Thu, 13 Dec 2012, 11:44

Видимо как-то так:
Code: Select all
#( ftp
Time: 0 7-23/1
Time: 0 0-7/2
SingleInstance
Action:
SEM1 GET
FILE-EXIST: "ftp\ncftpget.exe"
\ Проверю наличие приложения ncftpget
IF
HOST-EXIST: "x.x.x.x"
\ Пингую сервер
IF

S" COMPUTERNAME" ENV 2 /STRING S>NUM 7 * 1000 * PAUSE

SWHide
START-APPW: "ftp\ncftpget.exe" .....
ExitCodeProc
\ ....
\ Выполняю операции в зависимости от кода возврата.
\ ....
ELSE
\ Запись в лог что сервер не пингуется"
THEN
ELSE
\ Запись в лог что не найдено приложение ncftpget.exe
THEN
SEM1 RELEASE
)#
Last edited by Morituruz on Thu, 13 Dec 2012, 13:27, edited 1 time in total.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Запуск задачи по "плавающему" времени

Postby ruspad » Thu, 13 Dec 2012, 12:15

Moriturus wrote:Видимо как-то так:
Code: Select all

COMPUTERNAME 2 /STRING S>NUM 7 * 1000 * PAUSE


В этом случае задача аналогично будет висеть на паузе
при этом если отслеживать корректность выполнения задачи например с помощью флага,
чтобы запустить её повторно, тогда будет также срабатываться эта задержка. :(
ruspad
 
Posts: 16
Joined: Mon, 05 Mar 2012, 16:12

Re: Запуск задачи по "плавающему" времени

Postby Morituruz » Thu, 13 Dec 2012, 13:10

ruspad wrote:В этом случае задача аналогично будет висеть на паузепри этом если отслеживать корректность выполнения задачи например с помощью флага, чтобы запустить её повторно, тогда будет также срабатываться эта задержка.

Так в чём проблема? Ставьте на паузу в зависимости от этого флага.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Запуск задачи по "плавающему" времени

Postby VoidVolker » Thu, 13 Dec 2012, 13:18

ruspad wrote:хмм... спасибо, даже и не знал, что у слова PAUSE: есть постфиксная нотация. =)

Практически у всех слов с двоеточием в конце есть постфиксный синоним, а если быть точнее, то через него они и определены.
ruspad wrote:Вот этим словом я получаю время задержки
Code: Select all
: time
S" %COMPUTERNAME%" EVAL-SUBST comp PLACE
comp COUNT 2 /STRING comp PLACE
S" %comp COUNT%" EVAL-SUBST S>NUM TO timewait
timewait 7 * TO timewait
;


Сокращается до:
Code: Select all
S" COMPUTERNAME" ENV 2 /STRING S>NUM TO timewait
timewait 7 * TO timewait


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

Re: Запуск задачи по "плавающему" времени

Postby ruspad » Thu, 13 Dec 2012, 15:30

VoidVolker wrote:
ruspad wrote:хмм... спасибо, даже и не знал, что у слова PAUSE: есть постфиксная нотация. =)

Практически у всех слов с двоеточием в конце есть постфиксный синоним, а если быть точнее, то через него они и определены.

Спасибо, большое! Теперь буду знать! =)

VoidVolker wrote:Не так, какова задача в целом? Вычислить на сервере время запуска задачи и запусть её на определенной машине?

Нет задача будет выполнять на каждой машине.
А задача в целом, сделать так, чтобы каждая из машин коннектилась к серверу с определенной задержкой.
И в случае ошибки выполнялся повторный коннект например с задержкой в 5 минут.

Но текущий алгоритм меня немного не устраивает:
- Использование стороннего ПО "sleep.exe" (проблема устранена, изменением кода)
Но это тоже немного не то =(
- Задача запускается в начале каждого часа, далее происходит пауза в зависимости от имени компа.
Пытаюсь сделать так, что бы непосредственный запуск задачи был у учетом задержки. (не получается)
Допустим имя компьютера xx0250.
в итоге получаем примерно 30 минут задержки.
т.е. Задача стартовала в 15.00 по коду "дошла" до места паузы и выдерживается 30 минут, далее выполнение кода.
При этом задача захватывает флаг "SEM1 GET" соответственно ни одна задача с аналогичным флагом выполниться не может.

Также, если в результате выполнения кода возникла ошибка и попытаться по флагу запустить эту задачу повторно то задержка будет также 30 минут.
Чего совершенно не хочется.

Вот если бы можно было как-то так:

Code: Select all
Time: %timewait% 7-23/1
Time: %timewait% 0-7/2
ruspad
 
Posts: 16
Joined: Mon, 05 Mar 2012, 16:12

Re: Запуск задачи по "плавающему" времени

Postby WAndrey » Thu, 13 Dec 2012, 19:18

Пару мыслей по прочитанному :)
- Крон позволяет подключать несколько кронтабов
- В основном кронтабе делаем задачу, которая стартует при запуске крона, вычисляет задержку по имени и генерит кронтаб с основной задачей, где уже задано время запуска задачи с учетом задержки
- Крон, обнаружив факт изменения кронтаба, перечитывает его и запуск задачи по "плавающему" времени достигнут :)
- Ошибки вполне можно обрабатывать в цикле и что-то лучше паузы в пять минут трудно придумать...
WAndrey
 
Posts: 44
Joined: Fri, 20 May 2011, 10:57

Re: Запуск задачи по "плавающему" времени

Postby Morituruz » Thu, 13 Dec 2012, 20:58

Задачу можно генерировать просто через EVALUATE строки, знать бы ещё как её удалить :-)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Запуск задачи по "плавающему" времени

Postby WAndrey » Thu, 13 Dec 2012, 22:07

Ну я думаю, что все же легче в существующем файле вторую строку заменить :)
WAndrey
 
Posts: 44
Joined: Fri, 20 May 2011, 10:57

Re: Запуск задачи по "плавающему" времени

Postby AlikasS » Fri, 14 Dec 2012, 02:35

ruspad wrote:Вот если бы можно было как-то так:
Code: Select all
Time: %timewait% 7-23/1
Time: %timewait% 0-7/2

можно
Code: Select all
S" Time: */%timewait% * * * * *" EVAL-SUBST EVALUATE
Action:

только строка
S" Time: */%timewait% * * * * *" EVAL-SUBST

или подобная но в твоем варианте

при разворачивании должна соответствовать крон-формату времени
Time: <Minutes> <Hours> <Days> <Months> <WeekDays> <Years>
* * * * * *
| | | | | |
| | | | | +--- Годы (диапазон: 1900-3000)
| | | | +----- Дни недели (диапазон: 1-7)
| | | +------- Месяцы (диапазон: 1-12)
| | +--------- Дни месяца (диапазон: 1-31)
| +----------- Часы (диапазон: 0-23)
+------------- Минуты (диапазон: 0-59)
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Запуск задачи по "плавающему" времени

Postby Yury Zhukov » Fri, 14 Dec 2012, 08:47

Если timewait в минутах, то я бы поступил проще: запустил бы дополнительную задачу, которая каждую минуту проверяет условия, времена задержки и флаги ошибок, которые произошли ранее, а на этом основании уже запускает если нужно исходную задачу.
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Re: Запуск задачи по "плавающему" времени

Postby ruspad » Tue, 18 Dec 2012, 20:47

Получаю %timewait% в отдельной задаче, при этом если значение больше 59 тогда делю его на 7:
Code: Select all
#( timing
RunOnce NoDel
0 VALUE timewait
Action:
S" COMPUTERNAME" ENV 2 /STRING S>NUM TO timewait
timewait 59 >
IF
BEGIN
timewait 7 / TO timewait
timewait 59 <
UNTIL
THEN
)#

AlikasS wrote:можно
Code: Select all
S" Time: */%timewait% * * * * *" EVAL-SUBST EVALUATE
Action:



В основной задаче (в моём случае):
Code: Select all
S" Time: */%timewait% 7-23/1 * * * *" EVAL-SUBST EVALUATE
S" Time: */%timewait% 0-7/2 * * * *" EVAL-SUBST EVALUATE

Задача почему-то не стартует :cry:
Где косяк та зарыт? :)
ruspad
 
Posts: 16
Joined: Mon, 05 Mar 2012, 16:12

Re: Запуск задачи по "плавающему" времени

Postby WAndrey » Wed, 19 Dec 2012, 10:08

Рискну предположить, что переменную надо вне первой задачи определить.
WAndrey
 
Posts: 44
Joined: Fri, 20 May 2011, 10:57

Next

Return to nnCron forum (Russian)

Who is online

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

cron