Обсуждение программ nnCron и nnCron LITE
by ruspad » Wed, 12 Dec 2012, 20:04
Всем привет! Имеется парк машин ~ 270 шт. имена компьютеров определены по маске XX0001, XX0002 и т.д. Все эти машины конектятся к одному серверу согласно задаче один раз в 1 час днем и 1 раз в 2 часа ночью. Помогите, пожалуйста, реализовать возможность запуска задачи в зависимости от имени компьютера. Я уже реализовал задачу где убираются первые 2 символа а последние 4 преобразовываю в число, далее умножаю полученное значение на 7. таким образом получаю время задержки. И в момент выполнения задачи скармлеваю как параметр приложению "sleep.exe" - все работает. Кстати, почему-то слово "PAUSE:" не воспринимает полученное значение из переменной. =( Хочу (но не могу) как-то подставлять именно время выполнения (т.е. так называемую задержку) в задачу. т.е. чтобы задача начала выполняться согласно полученной задержке, а не так чтобы задача висела в ожидании несколько десятков минут. Также, никак не могу сообразить  , как реализовать повторный коннект к серверу (например, раз в 5 минут) если в момент выполнения ответ (пинг) от сервера не получен. Заранее спасибо, за помощь. =)
-
ruspad
-
- Posts: 16
- Joined: Mon, 05 Mar 2012, 16:12
by 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. Описать алгоритм более понятно: что есть и как должно быть.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by 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
by 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.
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by 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
by Morituruz » Thu, 13 Dec 2012, 13:10
ruspad wrote:В этом случае задача аналогично будет висеть на паузепри этом если отслеживать корректность выполнения задачи например с помощью флага, чтобы запустить её повторно, тогда будет также срабатываться эта задержка.
Так в чём проблема? Ставьте на паузу в зависимости от этого флага.
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by 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
Не так, какова задача в целом? Вычислить на сервере время запуска задачи и запусть её на определенной машине?
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by 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
by WAndrey » Thu, 13 Dec 2012, 19:18
Пару мыслей по прочитанному  - Крон позволяет подключать несколько кронтабов - В основном кронтабе делаем задачу, которая стартует при запуске крона, вычисляет задержку по имени и генерит кронтаб с основной задачей, где уже задано время запуска задачи с учетом задержки - Крон, обнаружив факт изменения кронтаба, перечитывает его и запуск задачи по "плавающему" времени достигнут  - Ошибки вполне можно обрабатывать в цикле и что-то лучше паузы в пять минут трудно придумать...
-
WAndrey
-
- Posts: 44
- Joined: Fri, 20 May 2011, 10:57
by Morituruz » Thu, 13 Dec 2012, 20:58
Задачу можно генерировать просто через EVALUATE строки, знать бы ещё как её удалить 
-

Morituruz
-
- Posts: 728
- Joined: Sun, 14 Oct 2007, 01:51
by WAndrey » Thu, 13 Dec 2012, 22:07
Ну я думаю, что все же легче в существующем файле вторую строку заменить 
-
WAndrey
-
- Posts: 44
- Joined: Fri, 20 May 2011, 10:57
by 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)
-

AlikasS
-
- Posts: 1439
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
-
by Yury Zhukov » Fri, 14 Dec 2012, 08:47
Если timewait в минутах, то я бы поступил проще: запустил бы дополнительную задачу, которая каждую минуту проверяет условия, времена задержки и флаги ошибок, которые произошли ранее, а на этом основании уже запускает если нужно исходную задачу.
Нас невозможно сбить с пути,
Нам пофигу куда идти.
-
Yury Zhukov
-
- Posts: 243
- Joined: Thu, 16 Jun 2005, 09:22
- Location: Москва
by 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
Задача почему-то не стартует  Где косяк та зарыт? 
-
ruspad
-
- Posts: 16
- Joined: Mon, 05 Mar 2012, 16:12
by WAndrey » Wed, 19 Dec 2012, 10:08
Рискну предположить, что переменную надо вне первой задачи определить.
-
WAndrey
-
- Posts: 44
- Joined: Fri, 20 May 2011, 10:57
Return to nnCron forum (Russian)
Who is online
Users browsing this forum: Google [Bot] and 4 guests
|
|