Просмотров: 5249

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


Продолжение первой части.

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

Мы предлагаем воспользоваться уже готовым инструментом, доступным для пользователей с любым уровнем подготовки, – настоящим гибридом из планировщика, универсального автоматизатора и скриптора – nnCron. Работая с ним, как-то невольно приходит на ум известный афоризм: "Скоро техника дойдет до такого совершенства, что человек сможет обойтись без себя самого".

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

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

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

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

Итак, самое время попытаться выделить ключевую причину успеха 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 (графическому оконному интерфейсу), - с другой. Вот два лика nnCron, которые в народе часто затемняются лишь его самой известной первой функцией-реализацией - кроном.

И что важно отметить на этом этапе: синтаксис скриптов позволяет использовать одновременно как язык Форт (на котором, как мы уже знаем, и написан этот замечательный планировщик), так и собственные достаточно простые программные конструкции, которые подробно описаны в замечательной и очень подробной документации к программе, поэтому не будем на этом останавливаться здесь подробно.

Практика подкрепленная теорией

Итак, переходим к краткому описанию практической работы этих двух стратегических направлений программы. Начнем с самого формата 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:\xxx\wget.exe
 

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

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

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

    • Выполнять уловный запуск приложений и открытие документов.
    • Фоновое отслеживание событий в системе (изменение папок, открытие определенных окон и т. п.).
    • Вывод сообщений, напоминания, всплывающих подсказок.
    • Набор стандартных операций для работы с окнами, файлами, процессами, звуком, системными датой и временем.
    • Мониторинг и контроль производительности системы.
    • Эмуляция движений мыши и ввода с клавиатуры (собственно, наиболее востребованная часть).
    • Весь спектр операций с реестром.
    • Поддержка регулярных выражений.
    • Включение/выключение компьютера, энергосбережение.
    • Дополнительное встраивание и исполнение конструкций, написанных на языках 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 Files\Internet Explorer\notepad.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.

Читать окончание этой статьи

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru pikabu.ru blogger.com liveinternet.ru livejournal.ru google.com bobrdobr.ru yandex.ru del.icio.us

Подписка на обновления блога → через RSS, на e-mail, через Twitter
Теги: , , , ,
Эта запись опубликована: Вторник, 22 ноября 2011 в рубрике Обзоры.

4 комментария

Следите за комментариями по RSS
  1. Можно ли сделать так, чтобы задача выполнялась каждые 1,5 минуты? Именно 1мин. 30сек., а не 2 или 1 мин.

  2. Можно, даже элементарно - внимательно прочтите описание, я даже два способа вижу, т.к. некоторые кроны поддерживают ещё и дополнительный вариант написания - через интервал. О последнем в статье ничего не было, как правило указывается через / после всего описания, типа:

    * * * * * * / 1.5

    Боюсь ошибиться по памяти - посмотрите сами документацию.

  3. Ваш пример 00 13,18 * * 1-5 * c:\xxx\wget.exe

    если месяц начинается со вторника это не сработает.

  4. Чуть ошибся выше:

    ваш пример 00 20 1-5 * 1 *

    если месяц начинается со вторника это не сработает.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Зарегистрировать/комментатор

Для регистрации укажите свой действующий email и пароль. Связка email-пароль позволяет вам комментировать и редактировать данные в вашем персональном аккаунте, такие как адрес сайта, ник и т.п. (Письмо с активацией придет в ящик, указанный при регистрации)

(обязательно)


⇑ Наверх
⇓ Вниз