Программы для автоматизации процессов. часть 2

Введение

Шаблон задания для Cron выглядит примерно так:

Вот иллюстрация этого же шаблона, которую можно сохранить себе:

Формат cronjob-выражения

Звёздочками обозначены конкретные блоки времени.

Для отображения содержимого crontab-файла текущего пользователя используйте команду:

Для редактирования заданий пользователя есть команда:

Если эта команда выполняется в первый раз, вам предложат выбрать редактор для Cron:

Выбирайте на своё усмотрение. Вот так изначально выглядит crontab-файл:

В этом файле как раз нужно перечислять одну за другой все команды.

Чтобы изменить crontab-файл другого пользователя (например, ostechnix):

Ниже приведены несколько примеров cron-заданий:

  1. Чтобы выполнять команду каждую минуту, задание должно быть такое:

  2. Похожее задание, только команда будет вызываться каждые пять минут:

  3. Вызывать команду 4 раза в час (каждые 15 минут):

  4. Чтобы выполнить команду каждый час в 30 минут, пишем:

    Т. е. команда будет выполняться не каждые 30 минут, а тогда, когда значение минут будет равно 30 (например, 10:30, 11:30, 12:30 и т. д.).

  5. Значения времени можно комбинировать, перечислив их через запятую. Следующий код будет выполнять команду три раза в час: в 0, 5 и 10 минут.

  6. Выполнять команду каждый час будет следующее задание:

  7. Выполнение команды каждые два часа:

  8. Чтобы выполнять команду каждый день (в 00:00):

  9. Выполнение команды каждый день в 03:00:

  10. Выполнение команды каждое воскресенье (sunday):

  11. Другой вариант задания, которое будет выполнять команду каждое воскресенье (естественно, тоже в 00:00):

  12. Выполнение команды каждый день с понедельника по пятницу:

  13. Следующее задание будет выполнять команду каждый месяц, 1-го числа в 00:00:

  14. Выполнять команду в 16:15 каждого первого числа месяца будет это задание:

  15. Выполнение команды каждые три месяца:

  16. Выполнение команды в строго определённое время и месяц:

  17. Задание будет вызывать команду в начале каждого полугодия (в 00:00 1-го дня):

  18. Выполнение команды каждый год 1-го января в 00:00:

Ещё существуют готовые задания:

  • — одиночное выполнение команды при загрузке;
  • — раз в год;
  • — тоже раз в год;
  • — раз в месяц;
  • — один раз в неделю;
  • —  раз в день;
  • — тоже раз в день;
  • — раз в час.

Чтобы выполнять команду каждый раз после перезапуска сервера, используйте это задание:

Команда для очистки всех заданий текущего пользователя:

Чтобы узнать о подробностях, есть команда:

Вышеперечисленного уже должно хватить для базовой работы с Cron и составления заданий.

PHP конкретных

Если у вас есть задание cron, например:

И в случае ошибок ожидаем, что они будут отправлены вам, но они не — проверьте это.

PHP по умолчанию не отправляет ошибки в STDOUT. @see https://bugs.php.net/bug.php?id=22839

Чтобы исправить это, добавьте cli`s php.ini или в свою строку (или в вашу оболочку bash для PHP):

  • — define display_startup_errors = 1
  • — определить display_errors = ‘stderr’

1-я настройка позволит вам иметь такие смертельные, как «Memory oops» и 2nd — перенаправить их все на STDERR. Только после того, как вы сможете хорошо спать, так как все будет отправлено на почту вашего корня вместо того, чтобы просто войти в систему.

Как проверить, работает ли крон на сайте?

Быстрый способ убедиться что крон исправно работает — это опубликовать запись с датой позже текущей (она будет поставлена в очередь на публикацию) и посмотреть опубликуется она или нет.

Если крон работает, то запись просто опубликуется в заданное время. А если крон не работает, то мы увидим такую картину:

Крон может не работать по двум причинам:

  • Он отключен. Как отключать смотрите ниже.
  • Ваш сервер не умеет отправлять HTTP запросы. Крон активируется через неблокирующий HTTP запрос WP к самому себе.

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

define( 'ALTERNATE_WP_CRON', true );

Такой альтернативный запуск крона создаст запрос через , т.е. запрос будет отправлен не из PHP, а клиентом (браузером). Подробнее см. spawn_cron().

Выполняйте задачи в определенное время

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

В листинге 5 приведен пример работы сценария , который использовался ранее. В листинге 6 показан вывод, который отправляется пользователю после запуска задания

Обратите внимание, что он несколько более компактный, чем тот, что отсылается функцией cron

Листинг 5. Использование команды at
Листинг 6. Вывод задачи, запущенной командой at
From ian@lyrebird.raleigh.ibm.com  Sat Jul  7 10:25:00 2007
Date: Sat, 7 Jul 2007 10:25:00 -0400
From: Ian Shields 
Subject: Output from your job        5
To: ian@lyrebird.raleigh.ibm.com

It is now 10:25:00 on Saturday

Указание времени может быть достаточно сложным. В листинге 7 приведено несколько примеров. Более подробную информауию можно найти на страницах справочника man, посвященных команде , в файле /usr/share/doc/at/timespec или в файле типа /usr/share/doc/at-3.1.10/timespec, где 3.1.10 соответствует версии пакета .

Листинг 7. Значения времени в команде at
$ at -f mycrontest.sh  10pm tomorrow
job 14 at Sun Jul  8 22:00:00 2007
$ at -f mycrontest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007
$ at -f mycrontest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007
$ at -f mycrontest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007

Для команды есть также опция
(queue — очередность). Увеличение очередности увеличивает значение для задания.

Существует также команда , которая похожа на
, за исключением того, что команды выполняются только когда система достаточно мало загружена. Более подробно эти свойства описаны на страницах справочника man.

Работа с планировщиком crontab

Доступнее и проще объяснить работу чего-либо ни с помощью «сухой» теории, а с помощью конкретных примеров.

Поэтому давайте, к примеру, добавим новое задание на ежедневную загрузку в 7 часов утра бесплатной (для домашнего использования) антивирусной программы Dr.Web CureIt! в директорию /home/AntiVirus.

Для каждой задачи целесообразнее на сервере создавать своего пользователя, от которого будут выполняться все действия. Благодаря этому в любое время можно будет добавить или убрать без особого вреда права доступа и разрешения.

Будем полагать, что такой пользователь создан (к примеру, drweb) и все права доступа на директорию, где будет в дальнейшем хранится антивирус, выставлены. Можно этого и не делать.

  1. Для того, чтобы добавить новое задание в crontab от имени drweb, необходимо выполнить команду:
    sudo crontab -e -u drweb

    Где ключ -e говорит о том, что файл открыт для редактирования (edit), а ключ -u позволяет указать от имени какого пользователя будет происходит выполнение задания (user).

    Если Вы хотите запустить задание от имени своего пользователя, то указывать конкретного пользователя не обязательно.

    Если Вы планируете выполнять задание от суперпользователя root или от любого другого, необходимо использовать sudo.

    Если Вы до этого ни разу не пользовались crontab, то при первом обращении к нему Вам будет предложено на выбор несколько текстовых редакторов.

    После этого уже непосредственно откроется текстовый файл.

  2. Первым делом следует убедиться, что в самом начале файла присутствуют строки:

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    Возможно они не всегда нужны, но без них возможно придется писать полные пути к консольным командам. В Ubuntu 11.04 эти строки можно не вносить.

  3. Ниже следует добавлять задания.

    Общая форма записи задания выглядит так:

    где

    — это минуты для запуска (0-59);

    — это часы для запуска (0-23);

    — это день месяца для запуска (1-31);

    — это номер месяца в году для запуска (1-12);

    — это день недели для запуска (0-6), где 0 — воскресенье;

    — это непосредственно команда-действие, которое нужно совершить в указанное время.

    Несколько уточнений:

    • Одно задание — одна строчка в файле.
    • Между параметрами может быть как пробел, так и табуляция.
    • Если какой-то из этих параметров должен включать в себя все возможные значения или этот параметр в данный момент не важен, то должен использоваться символ * (звездочка).

      К примеру, если есть необходимость выполнить задание каждый раз, когда наступает 30 августа 12.20, то первые 5 параметров будут 20 12 30 8 *, если, к примеру, нужно выполнять задание каждую субботу в 00.00, то 5 первых параметров будут 0 0 * * 6

    • Если Вам необходимо указать диапазон времени запуска, то нужно использовать /period.

      К примеру, если необходимо запускать задание каждые 20-минут, то последние 5 параметров будут */20 * * * *, если каждый второй месяц в 00.00, то 0 0 * */2 *

    • Также диапазон можно обозначить и так 0 0 10-20 * *, т. е. задание будет выполняться каждый месяц с 10 по 20 число в 00.00
    • Если какой-то параметр имеет несколько значений, то значения можно перечислить через запятую.

      К примеру, запись 0 0 10,20 * * говорит о том, что задание будет выполняется 10 и 20 числа каждого месяца в 00.00

    • После добавления задания необходимо перевести курсор на новую строку, как бы дать понять cron`у, что это конец задания.

    В нашем случае c Dr.Web, необходимо добавить:
    0 7 * * * wget http://terrance.drweb.com/pub/drweb/cureit/setup.exe -O /home/AntiVirus/cureit.exe

    Если требуется совершить действие, которое не ограничивается выполнением одной команды, то необходимо создать файл (скрипт) и вызывать его исполнение в crontab.

    Для того, чтобы ваши задания взаимодействовали с графическим окружением нужно передать переменную DISPLAY. К примеру, если Вы хотите открывать каждый час музыкальный проигрыватель Rhythmbox, то строка задания должна быть:

    * */1 * * * export DISPLAY=:0; rhythmbox;

  4. Чтобы убедиться в том, что все данные были внесены верно, можно выполнить команду crontab с ключом -l (маленькая английская л), то есть:
    sudo crontab -l -u drweb

После сохранения изменений в файле, данные будут перенесены в конфигурационный файл /var/spool/cron/crontabs/drweb и будут ждать своего исполнения.

Отладка команд cron

Проверьте почту! По умолчанию cron отправит любой результат из команды пользователю, который выполняет команду as. Если нет выхода, почты не будет. Если вы хотите, чтобы cron отправил почту на другую учетную записьто вы можете установить переменную среды MAILTO в файле crontab, например.

Захватите результат самостоятельно

, который захватывает stdout и stderr в /tmp/mycommand.log

Посмотрите на журналы; cron регистрирует свои действия через syslog, которые (в зависимости от вашей установки) часто переходят к или .

При необходимости вы можете фильтровать операторы cron, например.

Теперь, когда мы рассмотрели основы cron, где находятся файлы и как их использовать, давайте рассмотрим некоторые общие проблемы.

Убедитесь, что cron работает

Если cron не запущен, ваши команды не будут запланированы …

должно получиться что-то вроде

или

Если не перезапустить его

или

Могут быть другие методы; используйте то, что предоставляет ваш дистрибутив.

cron запускает вашу команду в ограниченной среде.

Какие переменные среды доступны, вероятно, будут очень ограниченными. Как правило, вы получаете только определенные переменные, такие как , и .

Особо следует отметить, что ограничен . Подавляющее большинство «моего cron-скрипта не работает», проблемы вызваны этим ограничительным путем . Если ваша команда находится в другом месте, вы можете решить это несколькими способами:

  1. Укажите полный путь к вашей команде.

  2. Предоставьте подходящую PATH в файле crontab

Если вашей команде нужны другие переменные среды, вы также можете определить их в файле crontab.

cron запускает вашу команду с помощью cwd == $ HOME

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

Последняя команда в моем crontab не запускается

Обычно Cron требует, чтобы команды были завершены новой строкой. Отредактируйте свой crontab; перейдите к концу строки, содержащей последнюю команду, и вставьте новую строку (нажмите enter).

Проверьте формат crontab

Вы не можете использовать crontab crontab crontab для /etc /crontab или фрагменты в /etc/cron.d и наоборот. Пользователь crontab, отформатированный пользователем, не включает имя пользователя в шестой позиции строки, а система, форматированная crontab, включает имя пользователя и запускает команду в качестве этого пользователя.

Я помещаю файл в /etc/cron.{hourly,daily,weekly,monthly} и он не запускает

  • Убедитесь, что имя файла не имеет расширения, см. части запуска
  • Убедитесь, что у файла есть разрешения на выполнение.
  • Сообщите системе, что использовать при выполнении вашего скрипта (например, put наверху)

Связанные с Cron ошибки

Если ваша дата недавно была изменена пользовательским или системным обновлением, часовым поясом или другим, то crontab начнет вести себя беспорядочно и проявлять странные ошибки, иногда работая, а иногда и нет. Это попытка crontab попытаться «сделать то, что вы хотите», когда время изменится из-под нее. Поле «минута» станет недействительным после изменения часа. В этом случае будут приняты только звездочки. Перезагрузите cron и повторите попытку, не подключаясь к Интернету (так что дата не имеет возможности перезагрузить один из серверов времени).

Знаки процента, снова

Чтобы подчеркнуть совет о знаках процента, вот пример того, что делает cron с ними:

создаст файл ~ /cron.out, содержащий 3 строки

Это особенно навязчиво при использовании команды . Обязательно избегайте процентных знаков

12 ответов

72

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

Шаг 1 : я временно помещаю эту строку в crontab пользователя:

затем вытащил его после того, как файл был записан.

Шаг 2 . Сделал себе небольшой скрипт bas-as-cron bash, содержащий:

Итак, как пользователь, о котором идет речь, я смог

Это решение, очевидно, может быть расширено, чтобы использовать sudo или такие для большей гибкости.

Надеюсь, что это поможет другим.

32

Я представляю решение на основе ответа Pistos, но без недостатков.

  • Добавьте следующую строку в crontab, например. используя

  • Создайте сценарий оболочки, который выполняет команду в той же среде, где выполняются задания cron:

Использование:

например.

Обратите внимание, что второй аргумент нужно указывать, если для этого требуется аргумент.
Первая строка скрипта загружает оболочку POSIX в качестве интерпретатора. Вторая строка содержит файл среды cron

Это необходимо для загрузки правильной оболочки, которая хранится в переменной окружения . Затем он загружает пустую среду (чтобы предотвратить утечку переменных среды в новую оболочку), запускает ту же оболочку, которая используется для cronjobs и загружает переменные среды cron. Наконец, команда выполнена.

14

Поскольку crontab не выполняет эту работу, вы можете манипулировать ее содержимым:

Что он делает:

  • перечисляет задания crontab
  • удалить строки комментариев
  • удалить конфигурацию crontab
  • затем запустите их один за другим.

5

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

Если ваши сценарии не работают должным образом, вы не принимаете во внимание, что

  • скрипт работает как конкретный пользователь
  • cron имеет ограниченную среду (наиболее очевидным проявлением этого является другой путь).

Из crontab (5):

В общем, PATH — самая большая проблема, поэтому вам нужно:

  • Явно установить PATH внутри скрипта во время тестирования в /usr /bin: /bin. Вы можете сделать это в bash с помощью export PATH = «/usr /bin: /bin»
  • Явно установить правильный PATH, который вы хотите в верхней части crontab. например PATH = «/usr /bin: /bin: /usr /local /bin: /usr /sbin: /sbin»

Если вам нужно запустить скрипт как другой пользователь без оболочки (например, www-data), используйте sudo:

Первое, что нужно проверить перед всем этим, конечно, состоит в том, что ваш скрипт фактически выполняет то, что он должен делать из командной строки. Если вы не можете запустить его из командной строки, это, очевидно, не будет работать с cron.

1

Ну, пользователь такой же, как тот, который вы вложили в запись crontab (или чей crontab вы положили его поочередно), так что это не проблема. (5) должен предоставить вам список переменных окружения, есть только несколько.

1

В большинстве crontab, например, например, vixie-cron вы можете поместить переменные в самом crontab, как это, а затем использовать /usr /bin /env, чтобы проверить, работает ли это. Таким образом, вы можете заставить свой скрипт работать в crontab, как только вы узнаете, что случилось с сценарием run-as-cron.

1

Сценарий Марко по какой-то причине не работал для меня. У меня не было времени на отладку, поэтому я написал скрипт Python, который делает то же самое. Это длиннее, но: во-первых, это работает для меня, а во-вторых, мне легче понять. Измените «/tmp /cron-env» на место, где вы сохранили среду. Вот он:

1

Решение Marco не сработало для меня, но работает скрипт python от Noam. Вот небольшая модификация сценария Марко, которая заставила его работать для меня:

Добавленные переменные экспорта , определенные в скрипте $ 1, и сделали его доступным для команды $ 2

p.s. Питон Noam работал, потому что он «экспортировал» среду в дочерний процесс.

Я никогда не нашел способ запуска заданий cron вручную, но этот файл предлагает установить ту же среду, что и cronjob, и запустить скрипт вручную.

вы можете запрограммировать задание для запуска в следующую минуту:)

Если это сценарий оболочки, это должно сделать вам большую часть пути:

Это определенно выделит некоторые проблемы, если не все.

-2

Если вам просто нужно запустить его немедленно, просто чтобы проверить, используйте этот формат:

Например, если вы хотите запустить сегодня (9/20/2016) в 16:30.

Удостоверьтесь, что вы изменили свое задание cron позже, поскольку это будет работать 20-го числа каждого месяца.

Использование Anacron

Один из самых больших недочетов Cron заключается в том, что он предполагает, что сервер или компьютер всегда включен. Если в установленное время выполнения задачи машина выключена, задача не будет запущена.

Это серьезная проблема для систем, которые не могут быть включены постоянно. Потому был разработан инструмент под названием anacron. Anacron значит «анахронический», и используется для устранения этого недочета cron.

Anacron использует не такие подробные параметры, как cron. Наименьший интервал, который существует в anacron – это день. Это значит, что anacron нужно использовать как дополнение к cron, а не как замещение его.

Преимущество anacron состоит в том, что он пользуется временными метками для файлов, чтобы узнать, когда команды были выполнены в последний раз. Это значит, что если задача должна выполняться ежедневно, но компьютер был выключен в течение времени, когда anacron запускается, то он может увидеть, что задача была запущена в последний раз более 24 часов назад, и выполнит ее правильно.

Утилита anacron, как и cron, имеет таблицу планирования. Она имеет соответственное название «anacrontab» и также находится в каталоге «/etc». Рассмотрим ее формат:

Как можно заметить, ее формат похож на формат файла crontab, но она содержит меньшее количество столбцов, а также имеет некоторые отличия.

Первый столбец определяет, как часто команда должна быть запущена. Значение указывается в виде интервала в днях. Значение «1» будет работать каждый день, а значение «3» — каждые три дня.

Второй столбец определяет отсрочку выполнения команды. Дело в том, что Anacron – не демон. Он запускается в одно и то же время. Данное поле позволяет расположить выполнение команд таким образом, чтобы не все команды были запущены в одно и то же время.

К примеру, первая строка запускается каждый день через 5 минут после запуска anacron:

Следующая строка запускается каждую неделю через 10 минут после вызова anacron:

Третья колонка содержит имя, по которому работа будет известна в сообщениях и лог-файлах Anacron. Четвертое поле – команда, запущенная в данный момент.

Как видно, anacron запускает некоторые из скриптов cron. Разные дистрибутивы обрабатывают это столкновение по-разному, отдавая предпочтение одной из команд и отключая действия другой.

К примеру, на Ubuntu «/etc/crontab» проверяет, доступен ли в системе anacron, и затем выполняет скрипты каталогов «cron.*» с помощью cron, если anacron не был найден.

Другие дистрибутивы указывают cron обновлять временные отметки Anacron при каждом запуске этих каталогов, чтобы anacron не выполнял их при запуске.

Создание крон задач

Для создания новых крон задач используется одна из функций: или .

Вызывать функции создания крон задач нужно только один раз! Обычно это делается при активации плагина, а при деактивации эти крон задачи нужно удалять. Или можно сначала проверить нет ли уже указанной крон задачи, если нет, то добавить.

При вызове функции регистрации задачи она записывается в опцию сайта cron и работает уже от туда автономно.

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

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

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

События считаются одинаковыми, если совпадают: название хука и передаваемые параметры.

Запланируем ежечасное действие для плагина. Для этого вызовем при активации плагина (если делать не при активации, то мы получим множество запланированных событий!).

register_activation_hook(__FILE__, 'my_activation');
function my_activation() {
	// удалим на всякий случай все такие же задачи cron, чтобы добавить новые с "чистого листа"
	// это может понадобиться, если до этого подключалась такая же задача неправильно (без проверки что она уже есть)
	wp_clear_scheduled_hook( 'my_hourly_event' );

	// Проверим нет ли уже задачи с таким же хуком
	// этот пункт не нужен, потому что мы выше удалил все задачи.
	// if( ! wp_next_scheduled( 'my_hourly_event' ) ) 

	// добавим новую cron задачу
	wp_schedule_event( time(), 'hourly', 'my_hourly_event');
}

add_action( 'my_hourly_event', 'do_this_hourly' );
function do_this_hourly() {
	// делаем что-либо каждый час
}

// При деактивации плагина, обязательно нужно удалить задачу:
register_deactivation_hook( __FILE__, 'my_deactivation' );
function my_deactivation(){
	wp_clear_scheduled_hook( 'my_hourly_event' );
}

Этот пример не полагается на активацию плагина (через директорию плагинов), вместо этого он добавляет событие, если его не существует.

// добавляет новую крон задачу
add_action( 'admin_head', 'my_activation' );
function my_activation() {
	if( ! wp_next_scheduled( 'my_hourly_event' ) ) {
		wp_schedule_event( time(), 'hourly', 'my_hourly_event');
	}
}

// добавляем функцию к указанному хуку
add_action( 'my_hourly_event', 'do_this_hourly' );
function do_this_hourly(){
	// делаем что-либо каждый час
}

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

Смотрите в описании функции wp_schedule_event().

// добавляет новую одноразовую крон задачу
add_action( 'admin_head', 'my_activation' );
function my_activation() {
	if( ! wp_next_scheduled( 'my_new_event' ) ) {
		wp_schedule_single_event( time() + 3600, 'my_new_event' );
		// time() + 3600 = 1 час с текущего момента.
	}
}

add_action( 'my_new_event','do_this_in_an_hour' );
function do_this_in_an_hour(){
	// делаем что-нибудь
}

Смотрите в описании функции wp_schedule_single_event().

Функции крона

Добавление:

wp_schedule_event( $timestamp, $recurrence, $hook, $args )
Создает многоразовую крон-задачу. Устанавливает хук, который будет вызываться каждый раз через указанный интервал времени.
wp_schedule_single_event( $timestamp, $hook, $args )
Создает одноразовую крон-задачу. Устанавливает хук, который будет вызван всего один раз в указанное время.

Удаление:

wp_unschedule_event( $timestamp, $hook, $args )
Удаляет конкретную крон-задачу. Для удаления нужно знать все 3 параметра.
wp_clear_scheduled_hook( $hook, $args )
Отменяет (удаляет) запланированные cron задания по указанному имени хука и передаваемым параметрам. Работает на основе .
wp_unschedule_hook( $hook )
Удаляет из расписания крон абсолютно все крон задачи по указанному хуку

Тут не важно какие параметры были указаны при регистрации задачи.

Остальное:

wp_next_scheduled( $hook, $args )
Возвращает метку времени (timestamp) когда должно сработать следующее по расписанию cron задание. Позволяет проверить есть ли в крон указанное задание.
wp_doing_cron()
Определяет является ли текущий запрос, запросом к Крону. Условный тег.
wp_get_schedules( )
Получает поддерживаемые Cron интервалы времени.

Весь список смотрите по этой ссылке.

Features

Besides possessing the traditional scheduler features (starting programs, displaying reminder messages and opening documents at specified time), nnCron also can:

  • start any program as a service
  • run tasks as if they were started by specified user
  • handle and restart so called missed tasks and reminders
  • shut down and hibernate the computer or put it into sleep mode at a specified time
  • «wake up» the computer in order to run a task
  • display, hide, close, kill, minimize, maximize and hide specified windows to system tray
  • display messages on screen and write them in a log file
  • work with clipboard, files and registry
  • emulate keyboard input and mouse activities
  • dial and hang up
  • use the system speaker to make beeps of specified length and frequency
  • play audio files
  • sync system time
  • assign a specified priority to a process
  • terminate any running process
  • restart automatically after fatal errors
  • keep track of files, flags, windows, processes, mouse activities, periods of idle time, keyboard shortcuts, getting online/off line, insertion of disk in a drive, presence of a host in network (ping), amount of free space on a disk, etc., etc.

nnCron understands cron table format (Unix) and is managed with easy-to-edit plain text crontab files. However, for those who prefer to work in a GUI environment, the program has a graphical shell which can be used to remove, add, edit and run tasks, set up reminders, change program settings.

nnCron has its own powerful (Forth-compatible) scripting language, allows to use VBScript/JScript, as well as regular expressions, and can be further extended with plugins. It can be started as a service or as a regular standalone application. You can examine nnCron features in depth by reading it’s online documentation.

4: Управление выводом cron

Поскольку задачи cron выполняются в фоновом режиме, их результат не всегда очевиден. Теперь, когда вы знаете, как использовать команду crontab и как планировать задачи в cron, вы можете познакомиться с несколькими способами перенаправления вывода cron, что поможет вам отслеживать их выполнение.

Если на вашем сервере установлен и настроен агент пересылки почты, например Sendmail, вы можете отправить выходные данные задач cron на адрес электронной почты, связанный с вашим профилем пользователя Linux. Вы также можете вручную указать адрес электронной почты, добавив параметр MAILTO в верхней части crontab.

Например, попробуйте добавить следующие строки в crontab. Среди них есть оператор MAILTO, за которым следует условный электронный адрес, директива SHELL, которая задает оболочку (в этом примере bash), директива HOME, указывающая путь, по которому следует искать двоичный файл cron, и одна задача cron:

Эта конкретная задача будет возвращать строку «Run this command every minute», и этот вывод будет каждую минуту отправляться на адрес электронной почты, указанный в директиве MAILTO.

Вы также можете перенаправить вывод задачи cron в лог или в пустое место, чтобы не получать его на почту.

Чтобы направить вывод запланированной команды в лог, добавьте >> в конец команды, а затем укажите имя и расположение лога:

Допустим, вы хотите использовать cron для запуска скрипта, но оставить его в фоновом режиме. Для этого вы можете перенаправить вывод скрипта в пустое место, например /dev/null, которое немедленно удаляет все записанные в него данные. Следующее выражение cron запускает скрипт PHP в фоновом режиме:

Это задание cron также перенаправляет стандартную ошибку (представленную 2) на стандартный вывод (>&1). Поскольку стандартный вывод уже перенаправляется в /dev/null, скрипт будет работать без вывода сообщений. Даже если crontab содержит директиву MAILTO, выходные данные не будут отправляться на указанный адрес электронной почты.

Вывод cron

После выполнения задачи cron отправляет выходные данные на электронный адрес пользователя (если только вывод не нужно направить в лог или /dev/null). Адрес электронной почты можно указать вручную, внеся параметр MAILTO в верхнюю часть crontab. Также можно указать оболочку, которую нужно запускать, путь к двоичному файлу cron и домашнему каталогу. Для этого:

сначала откройте crontab:

затем отредактируйте его следующим образом:

Данная строка вернет Run this command every minute. Демон cron будет отправлять такой вывод на почту example@some_user.com. Это, конечно, не очень удобно. Как уже говорилось ранее, данный вывод можно направлять в лог-файл, чтобы избежать подобных ситуаций.

Для этого нужно просто добавить:

Примечание: символы >> направят вывод в лог. Кроме логов можно также использовать /dev/null при помощи следующего PHP-скрипта, работающего в фоновом режиме.

Ссылка на основную публикацию