cron
ИМЯ
cron — инструмент для автоматизации периодического вызова команд
Содержание
КРАТКОЕ ОПИСАНИЕ
package require Tcl 8.6 9
package require cron ?2.2?
::cron::at ?processname? timecode command
::cron::cancel processname
::cron::every processname frequency command
::cron::in ?processname? timecode command
::cron::object_coroutine object coroutine ?info?
::cron::sleep milliseconds
::cron::task delete process
::cron::task exists process
::cron::task info process
::cron::task set process field value ?field...? ?value...?
::cron::wake ?who?
::cron::clock_step milliseconds
::cron::clock_delay milliseconds
::cron::clock_sleep seconds ?offset?
::cron::clock_set newtime
ОПИСАНИЕ
Пакет cron предоставляет набор инструментов на чистом Tcl, позволяющих программам планировать выполнение задач через регулярные интервалы. Вместо того чтобы заставлять каждую задачу самостоятельно обращаться к циклу обработки событий, система cron имитирует утилиту cron в Unix: задача периодически проверяет, нужно ли что-либо выполнить, и запускает все команды, назначенные на определённый момент времени, одновременно.
Изменения в версии 2.0
Изначально cron предназначался для работы с временными интервалами > 1 секунды, однако последняя версия поддерживает точность времени вплоть до миллисекунд, что упрощает интеграцию с другими событиями, связанными со временем. Версия 2.0 также поддерживает корректную интеграцию с сопрограммами и объектами. Кроме того, добавлена возможность использовать внешние часы (или часы, управляемые скриптом). Обратите внимание, что события в стиле vwait не будут хорошо работать с внешними часами.
Команды
-
::cron::at ?processname? timecode command
Эта команда регистрирует command для вызова в момент времени, заданный параметром timecode. Если timecode задан целым числом, он считается временем в формате Unix. Все остальные значения обрабатываются командой clock scan и преобразуются во время Unix. Эту задачу можно изменить последующими вызовами команд данного пакета, указав processname. Если processname уже существует, он будет заменён. Если processname не указан, команда сгенерирует и вернёт его.
::cron::at start_coffee {Tomorrow at 9:00am} {remote::exec::coffeepot power on} ::cron::at shutdown_coffee {Tomorrow at 12:00pm} {remote::exec::coffeepot power off} -
::cron::cancel processname
Эта команда отменяет регистрацию процесса processname и отменяет все ожидающие команды. Примечание: processname может быть процессом, созданным с помощью ::cron::at или ::cron::every.
::cron::cancel check_mail -
::cron::every processname frequency command
Эта команда регистрирует command для вызова с интервалом, заданным параметром frequency. Значение frequency указывается в секундах. Эту задачу можно изменить последующими вызовами команд данного пакета, указав processname. Если processname уже существует, он будет заменён.
::cron::every check_mail 900 ::imap_client::check_mail ::cron::every backup_db 3600 {::backup_procedure ::mydb} -
::cron::in ?processname? timecode command
Эта команда регистрирует command для вызова по истечении задержки, заданной параметром timecode. Значение timecode указывается в секундах. Эту задачу можно изменить последующими вызовами команд данного пакета, указав processname. Если processname уже существует, он будет заменён. Если processname не указан, команда сгенерирует и вернёт его.
-
::cron::object_coroutine object coroutine ?info?
Эта команда регистрирует сопрограмму coroutine, связанную с объектом object, для вызова с параметрами info. Если параметры не заданы, предполагается, что сопрограмма является фоновой задачей, которая завершится самостоятельно. Значение info можно задать в любом формате, совместимом с командой ::cron::task set.
-
::cron::sleep milliseconds
При вызове внутри сопрограммы эта команда зарегистрирует сопрограмму для обратного вызова в назначенное время и немедленно приостановит её выполнение.
Если значение переменной ::cron::time больше 0, эта команда будет продвигать внутреннее время шагами по 100 мс.
Во всех остальных случаях команда создаст фиктивную переменную, запланирует вызов after и будет ожидать переменную с помощью vwait:
set eventid [incr ::cron::eventcount] set var ::cron::event_#$eventid set $var 0 ::after $ms "set $var 1" ::vwait $var ::unset $varИспользование:
::cron::sleep 250 -
::cron::task delete process
Удаляет процесс, указанный в параметре process.
-
::cron::task exists process
Возвращает true, если process зарегистрирован в cron.
-
::cron::task info process
Возвращает dict с описанием process. Описание параметров см. в команде ::cron::task set.
-
::cron::task set process field value ?field...? ?value...?
Если process не существует, он создаётся. Доступные параметры:
-
Если coroutine имеет значение black, это глобальная команда, реализующая данный процесс. Если coroutine не имеет значения black, это команда для создания или повторного создания сопрограммы.
-
Имя сопрограммы (если она есть), реализующей данный процесс.
-
frequency
Если значение равно -1, процесс завершается после следующего события. Если значение равно 0, процесс должен вызываться при каждом событии простоя. Если значение положительное, процесс должен периодически генерировать события. Частота — это целое число миллисекунд между событиями.
-
Объект, связанный с этим процессом или сопрограммой.
-
scheduled
Если значение не равно нулю, это абсолютное время от начала эпохи (в миллисекундах), когда данный процесс вызовет событие. Если значение равно нулю и frequency также равно нулю, процесс вызывается при каждом цикле простоя.
-
Логический флаг. Значение true указывает, что процесс не завершился и не приостановился во время цикла обработки событий; он не будет вызван снова, пока этого не произойдёт.
-
-
::cron::wake ?who?
Активирует cron и планирует запуск его цикла обработки событий во время следующего цикла простоя.
::cron::wake {I just did something important}
Предусмотрено несколько вспомогательных команд, используемых внутри cron и для тестирования cron; в обычных случаях они могут быть полезны или не понадобиться.
-
::cron::clock_step milliseconds
Возвращает абсолютное время относительно начала эпохи, соответствующее следующей границе между секундами для значения milliseconds.
-
::cron::clock_delay milliseconds
Возвращает абсолютное время относительно начала эпохи, соответствующее следующей границе между секундами, которая наступит через milliseconds.
-
::cron::clock_sleep seconds ?offset?
Возвращает абсолютное время относительно начала эпохи, которое наступит ровно через seconds. Если задано значение offset, оно может быть положительным или отрицательным и сдвинет конечное время на момент до или после смены секунды.
-
::cron::clock_set newtime
Устанавливает внутренние часы cron. Эта команда будет продвигать время шагами по 100 мс, вызывая события, пока внутреннее время не достигнет значения newtime.
Значение newtime задаётся в абсолютных миллисекундах с начала эпохи.
Ошибки, идеи, отзывы
В этом документе и описываемом им пакете, несомненно, могут содержаться ошибки и другие проблемы. Просьба сообщать о них в категории odie системы отслеживания ошибок Tcllib. Также сообщайте о любых идеях по улучшению пакета и/или документации.
При предложении изменений кода предоставляйте унифицированные различия, то есть вывод команды diff -u.
Обратите также внимание, что вложения предпочтительнее встроенных исправлений. Чтобы добавить вложение, откройте форму Редактировать соответствующей заявки сразу после её создания и нажмите крайнюю левую кнопку на дополнительной панели навигации.
КАТЕГОРИЯ
Система
АВТОРСКИЕ ПРАВА
Авторские права © 2016-2018 Sean Woods