Авторизируйтесь,
чтобы продолжить
Некоторые функции доступны только зарегистрированным пользователям
Неправильный логин или пароль
Добавить софт
Мой софт

nnCron: планировщик на стероидах. Часть 1

Автор: Игорь Савчук
Опубликовано: 18.10.2011
Источник: SoftKey.info

Обзор сегодняшней программы я бы хотел начать, избежав традиционного теоретического введения, обычно логически подводя читателя к необходимости конкретной программы и оправданности её концепции. Так уж получилось, что сегодня у нас теория будет тщательно перемешена с практикой, подобно винегрету, поэтому, не теряя драгоценного времени, сразу переходим к практическому знакомству с программой и её концепцией.

Я думаю, многие пользователи наслышаны о мощнейшем инструменте планирования в операционных системах семейства Unix (по своей известности это в первую очередь относится к Linux) - cron. Cron, это очень мощная и гибкая форма записи неких временных интервалов, последовательностей, закономерностей из дат, которая необходима для того, чтобы объяснить планировщику, как и когда запускать программы, скрипты, выполнять какие-то действия с компьютером. Иначе говоря - cron, это удивительно гибкий для своей компактности микроязык, который является своего рода стандартом де-факто в мире Unix. К сожалению, пока не удалось придумать какую-то более мощную и одновременно простую систему записи правил и периодичности запуска процессов, чем это было сделано в cron (как минимум, мне такая система не известна).

Попытки переноса этой сверхудачной системы на платформу Windows предпринимались часто и многократно, и, если вы закинете свои сети в Интернет, вы, вероятно, сможете извлечь оттуда неплохой список-улов подобных программ, но у всех из них присутствует следующий серьёзный дефект. Мир, из которого пришел cron, - это царство командной строки и черных экранов: рабочее пространство консоли. В рамках же Windows мы, как правило, имеем дело с оконным интерфейсом, и поэтому удачно описать некую периодичность запусков самой задачи часто ещё недостаточно, нужны дополнительные инструменты, с этими самыми окнами-программами как-то взаимодействующие и манипулирующие.

Простой пример для иллюстрации этой мысли и серьёзности проблемы. Принятие почты в консоли Linux сводится к запуску некоего такого же консольного клиента в заданное время с заданными ключами, пусть и с учетом каких-то сложных условий, тщательно прописанных в cron. В Windows же вам потребуется не только запустить вашу почтовую программу, но и как-то инициализировать её процедуру соединения с Интернетом или запуск приема почты. Если в Linux это все делается консольными командами и ключами к соответствующим утилитам при запуске, то в Windows вам придётся, скорее всего, как-то интерактивно взаимодействовать с программой. То есть нажимать какие-то графические кнопки (или вызывать горячие клавиши и т. п.), что подразумевает наличие оператора за компьютером, сводя на нет всю гибкость мощного планировщика.

Итак, самое время попытаться выделить ключевую причину успеха nnCron: если раньше для решения этих двух связанных задач нужно было наличие двух разнородных инструментов на одном компьютере (один обеспечивает функции планировщика, другой - виртуальные нажатия кнопок и взаимодействия с графическим интерфейсом требуемой программы или окнами ОС), то теперь - всё удобно объединено в рамках одной тщательно продуманной программы. И, что очень важно, как это удобно было сделано!

Окно настройки nnCron в графическом режиме
Окно настройки nnCron в графическом режиме

Безусловно, попытки объединения этих двух смежных направлений делались и раньше, в силу этой очевидной специфики Windows, но просто сравните их результаты. Например, почти аналогичный по идее и очень известный на Западе AutoMate весит 15 Мб, тогда как более мощный nnCron - всего 740 Кб. Эта разница в размерах примерно адекватно показывает разницу в качестве реализации этих двух программ. Можно привести ещё много таких сопоставлений с аналогичным результатом, но не хочется терять драгоценное время - давайте сразу переходить к более близкому знакомству с nnCron.

Псковский автоматизатор

Для начала мне хотелось бы хотя бы немного остановиться на личности автора программы, Николае Немцеве, хотя бы потому, что в 90-х, на пике популярности этой программы, он по праву считался одним из самых удачных "шароварщиков" бывшего Союза, бойко продающих свои nnCron (и родственную nnBackup) в страны Западной Европы и Америки. Считаю, что коммерческий успех и популярность любой программы - это просто неизбежное следствие высокого качества и востребованности продукта. Вот как рассказывает сам автор про историю создания этой знаменитой утилиты:

"Как известно, у администратора очень много всякой рутинной работы. В первую очередь нужен планировщик. Вначале мне казалось, что системный планировщик Windows NT мне поможет, но быстро обнаружилась его ограниченность (набор временных интервалов просто никудышен). Порывшись в Интернете, я нашел несколько программ, приблизительно отвечавших моим требованиям, но при испытаниях у них тоже выявились разные недостатки.

В общем, я так мучался до тех пор, пока не нашел информацию о программе cron из мира UNIX. Идея задания периодичности так понравилась, что я тут же набросал нехитрую программку, которая выполняла функции cron. Да, кстати, несколько клонов cron под Windows тоже были мною исследованы и оказались просто неработоспособными. Ограниченность языка командных файлов (CMD) постоянно заставляла изощряться, и естественным продолжением стало появление элементов скриптов в этой моей программе. Написана она была на C++, и расширение в скриптовом смысле было не самым простым делом. Тогда я полностью переписал ее на Форте (SP-Forth), и получился nnCron. Насущные проблемы заставляли добавлять в эту программу возможность за возможностью, и однажды я понял, что получается программа, которую не стыдно и людям показать".

А вот как разработчик выделяет главные преимущества/отличия программы:

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

Не только планировщик

Итак, подытожим уже сказанное. Во-первых, нужно очень четко понять, что nnCron - это не только планировщик, хотя нужно признать, что планировщик он отменный. Во-вторых, исходя из первого пункта, нужно четко видеть его две составляющие и несущие всю конструкцию балки: это стандартный юниксовский cron с одной стороны и мощный блок скриптования, призванный автоматизировать всё и вся (и даже чуть-чуть больше), прекрасно приспособленный к особенностям GUI Windows (графическому оконному интерфейсу), с другой. И что важно отметить на этом этапе: синтаксис скриптов позволяет использовать одновременно как язык Форт (на котором, как мы уже знаем, и написан этот замечательный планировщик), так и собственные достаточно простые программные конструкции, которые подробно описаны в замечательной и очень подробной документации к программе, поэтому не будем на этом останавливаться здесь подробно.

Итак, переходим к краткому описанию этих двух стратегических направлений программы. Начнем с cron и классического режима работы программы.

Традиционный (унаследованный из мира UNIX) cron-формат состоит из пяти полей, разделенных пробелами. nnCron позволяет использовать так называемый "улучшенный" формат cron ([time_in_cron_format]) - расширенный до 6 значений последним полем "годы":

<Минуты> <Часы> <Дни_месяца> <Месяцы> <Дни_недели> <Годы>

При этом общий формат описания задачи по запуску команды в классическом режиме будет иметь вид (в нем левая часть - код временного крона, приведенный чуть выше, а правая - команда для запуска целевой программы/скрипта):

[time_in_cron_format] [command_to_exec]

Любое из шести полей в cron может содержать символ "*" в качестве универсального значения-шаблона (то есть он указывает на полный диапазон любых возможных значений для данного значения, например каждая минута, любой час и т. д.). Далее, любое из полей может содержать список заданных значений, разделенных запятыми (например, 1,3,7) или интервал из последовательных значений, задаваемый дефисом (например, так: 1-7). После звездочки (*) или интервала с помощью символа "/" указывается шаг значений, опять же если он нужен в конкретном случае (по умолчанию он равен /1). Таким образом, гибкая конструкция 0-6/2 может использоваться в поле "Часы" для указания того, что действие должно происходить каждые два часа, но только в течение поздней ночи и раннего утра, с 0 до 6. Давайте приведем пару полностью заполненных примеров, чтобы вы ощутили всю гибкость и мощь кроновского формата записи:

# выполнять указанное действие каждую минуту бесконечно
* * * * * *

# программа 'wget.exe' запускается каждый рабочий день в обед и после работы
00 13,18 * * 1-5 * c:xxxwget.exe

# запускать в каждый первый понедельник месяца в 20:00
00 20 1-5 * 1 *

# полная запись задачи в классическом формате, где указанный командный файл запускается каждые пять минут, но только по четным дням и в рабочее время
*/5 08-17 */2 * * * d:fidomailin.cmd

Пример содержимого кронтаба - файла содержащего все задачи для nnCron
Пример содержимого кронтаба - файла содержащего все задачи для nnCron

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

  • Выполнять уловный запуск приложений и открытие документов.
  • Фоновое отслеживание событий в системе (изменение папок, открытие определенных окон и т. п.).
  • Вывод сообщений, напоминания, всплывающих подсказок.
  • Набор стандартных операций для работы с окнами, файлами, процессами, звуком, системными датой и временем.
  • Мониторинг и контроль производительности системы.
  • Эмуляция движений мыши и ввода с клавиатуры (собственно, наиболее востребованная часть).
  • Весь спектр операций с реестром.
  • Поддержка регулярных выражений.
  • Включение/выключение компьютера, энергосбережение.
  • Дополнительное встраивание и исполнение конструкций, написанных на языках JScript и VBScript.
  • Работа с удаленным доступом (RAS).
  • Работа с почтовыми серверами по протоколу POP3.
  • Работа с журналом событий (WinNT/2000/XP).
  • Логические конструкции и ветвления для алгоритмизации сложных задач, создание массивов и вспомогательных функций.

Сразу подчеркиваю, что здесь описаны лишь основные возможности встроенного языка, то есть далеко не все.

Расширенные примеры

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

#( имя_задачи
комментарий до конца строки
[опции задачи]
[авторизация]
[спецификация времени (cron)(Time:)]
[спецификация события (watch)]
[условия запуска задачи (Rule:)]
[Действия (Action:)]
... выполняем работу
)#

Пример 1:
#( 1_task
проверка почты будет запускаться каждый час или принудительно по нажатии горячих клавиш Alt-Ctrl+F12; запустить почтовик, если есть новая почта
Time: 0 * * * * *
Also
WatchHotKey: @^{F12}
Rule: POP3-CHECK: "mail_hostname" "pop3_login" "your_password"
Action:
START-APP: e:the bat!thebat.exe /CHECKALL
)#

Пример 2:
#( 2_task
запускаем калькулятор и виртуально производим несложные вычисления
Time: 0 12 * * * *
Action:
START-APP: calc.exe
PAUSE: 500
WIN-ACTIVATE: "Calculator"
PAUSE: 100
SEND-KEYS: "1{+}2{ENTER}{DELAY 2000}*3{ENTER}"
)#

Пример 3:
#( 3_task
пример, аналогичный верхнему, демонстрирующий поддержку скриптования на VBScript/JScript
Time: 0 12 * * * *
Action:
< JScript>
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("calc");
WScript.Sleep(100);
WshShell.AppActivate("Calculator");
WScript.Sleep(100);
WshShell.SendKeys("2{+}2{*}3=");
< /SCRIPT>
)#

Пример 4:
#( 4_task
запускаем свернутый блокнот каждые 20 минут по рабочим дням (кроме среды) с обычным приоритетом
Time: */20 * * * 1,2,4,5 *
ShowMinimized NormalPriority
Action:
START-APP: C:Program FilesInternet Explorernotepad.exe
)#

Пример 5:
#( 5_task
несложный пример синхронизации времени, демонстрирующий управляющие конструкции
OnceADay
Rule: ONLINE?
Action:
TP-SYNC: time.nist.gov
TP-SYNC-RESULT 0<>
IF
CLEAR-ONCE
MSG: "Can't synchronize time"
ELSE
TMSG: "Time was synchronized. Server response delay: %TP-SYNC-DELAY%" 10
THEN
)#

Итак, подытожим всё, что мы сегодня узнали. В простейшем, классическом, режиме вы задаете команды в формате одной строки, состоящей из лидирующего условия-крона и целевой команды, которая будет запущена точно в зашифрованное в cron время. Второй вариант описания задач обрабатывается каждый раз, когда парсер nnCron встречает строчку, начинающуюся на "#( <имя_задачи>", после чего сразу переключается в расширенный режим, выполняя (или не выполняя, если cron-запись или другие условия этой задачи не истинны) задачу, заключенную в рамках конструкции обрамления отдельной задачи "#(" и ")#". После выхода за её пределы парсер снова возвращается в классический режим своей работы.

Разобравшись с основами программы - консолью и скриптами, - завтра во второй части статьи мы поговорим о графическом интерфейсе программы. nnCron - это настоящее Windows-приложение, а значит, здесь должны быть и окна с множеством плюшевых настроек, удобных, как минимум, для начинающих пользователей компьютера. Ну а для продвинутых пользователей я специально коснусь азов метаязыка Форт, на базе которого построен и неограниченно расширяется nnCron.



Статистика
Всего программ 30544
Скачиваний сегодня 318
Скачиваний вчера 1627