Частные случаи
Для запуска задачи чаще, чем раз в минуту, используем sleep.
Для этого пишем в crontab:
* * * * * /opt/php56/bin/php /home/k/konoplev/tmp/twtest.php; /bin/sleep 30; /opt/php56/bin/php /home/k/konoplev/tmp/twtest.php
для запуска файла каждые 30 секунд.
Иногда при использовании планировщика запуска программ cron неизвестно, сколько длится выполнение скрипта. Для избежания двойного запуска скрипта требуется проверка на завершение предыдущего запуска скрипта.
Логичным вариантом будет создание lock файла и при запуске скрипта проверять наличие файла. Но на хостинге Timeweb, как и на других хостингах, присутствует ограничение по процессору. Скрипт зависит от условий и времени выполнения, а значит, мы не можем предугадать время выполнения скрипта. Если скрипт выполнится с нарушением правил и ограничений (https://timeweb.com/ru/services/hosting/rules/), то процесс завершится со стороны хостинга. Тогда lock файл не будет удален, а значит, и скрипт не будет запускаться по крону, пока файл не будет удалён.
Маэстро из отдела инженеров рассказал, как решить задачу.
Для начала создаём sh скрипт в файл /home/c/cc123456/tmp/twtest.sh:
#!/bin/bash command=$@ no_spaces=`echo $command | sed -e 's/\s/_/g' -e 's|/|_|g'` pidfile=/var/tmp/$no_spaces.pid lockfile=/var/tmp/$no_spaces.lock if ] then pid=`cat $pidfile 2>/dev/null` ps h $pid >/dev/null 2>/dev/null if ] then exit 1 else rm $lockfile fi fi echo $$ > $pidfile /usr/bin/flock -w 0 $lockfile $command rm $pidfile
В панели управления в разделе crontab выбираем тип «Исполняемый бинарный файл».
В поле “Полный путь” пишем:
/home/c/cc123456/tmp/twtest.sh /opt/php56/bin/php /home/c/cc123456/tmp/twtest.php
Где
- /home/c/cc123456/tmp/twtest.sh — наш скрипт проверки
- /opt/php56/bin/php — путь до нужного интерпретатора
- /home/c/cc123456/tmp/twtest.php — путь до нашего скрипта
Указываем необходимое время запуска и придумываем название.
Документация — Установка. 5. Настройка cron
Что такое крон (cron)?
Это инструмент на вашем хостинге, который позволяет запускать скрипты по расписанию. Установка cron необходима для того, чтобы статистика по переходам трекера своевременно обновлялась.
Cron на хостинге не разрешает устанавливать обновление 1 раз в минуту. Что делать?
Вы можете использовать обновление 1 раз в 2 минуты или 1 раз в 5 минут. Задержка при обновлении данных будет немного больше, но на другую функциональность это не повлияет.
К примеру, /home/admin/data/server.ru/track-show/process_clicks.php >/dev/null 2>&1
Это не принципиально.
Сильно ли нагружает ресурсы сервера запуск cron каждую минуту?
Короткий ответ
1. Крон не грузит сервер, так как крон это всего лишь расписание, когда запускать ваш скрипт.
2. Сервер грузит регулярное выполнение вашего скрипта. Потребление ресурсов скриптом зависит от количества данных, которые он должен обработать. В нашем случае это количество переходов в минуту.
3. Да, это может быть чрезмерно затратно по ресурсам, зависит от того что делает скрипт и от того, сколько ресурсов вам выделил хостер.
Полный ответ
Запуск любых скриптов — приводит к определенной затрате ресурсов сервера. Регулярный запуск скриптов увеличивает эту нагрузку на количество запусков.
Была нагрузка в 1 единицу, запустили 60 раз в час — стала 60 единиц. Если хостер определяет нагрузку как количество потраченных ресурсов сервера за день или месяц — при регулярном выполнении скриптов вы можете выйти за какие-нибудь лимиты хостера.
Вам необходимо выяснить каким образом самостоятельно мониторить статистику загрузки вашего хостинга и настроить интервалы для запуска крона исходя из этого. Может быть вам достаточно обновления статистики раз в 5 минут (это всего 12 раз а час) или даже 10 минут (6 раз в час).
Количество ресурсов, которые потребляет скрипт за один запуск зависит от того, какое количество информации ему нужно обрабатывать. Если у вас за 5 предыдущих минут было несколько тысяч или несколько десятков тысяч переходов, для того чтобы их обработать и записать в базу — потребуется определенное время и ресурсы. Кроме этого, для определения страны посетителя также используются операции чтения из файлов, что тоже может считаться вашим хостером как потребление ресурсов.
Итак, общий принцип. Каждый запуск ест ресурсы. Чтобы снизить общее потребление можно а) уменьшить затраты на каждый запуск. Для этого нужно создавать меньше данных, то есть лить через трекер меньше трафика. б) уменьшить количество запусков. Для этого интервал для запуска крона делаем больше (5 минут, 10 минут, 30 минут, 1 час или даже больше, если вам не нужна оперативная информация и вы все равно смотрите статистику за прошлый день). Однако, от того что вы запускаете скрипт реже, данных которые он должен обработать не становится меньше. Мы выигрываем только на накладных расходах, которые не зависят от количества данных.
Общепринятой рекомендацией считается запуск подобного рода скриптов (трекеры, tds) на VPS или выделенных серверах. Так как любой простой из-за исчерпания ресурсов или каких-то проблем у хостера с вашими скриптами стоит вам вполне конкретных денег, впустую потраченных на рекламу или трафик.
Шаг 7. Удаление существующих cron задач
Теперь, когда мы можем создать новые cron задачи, по логике вещей, нам необходимо иметь возможность их удалить! Метод remove_cronjob () будет принимать один аргумент, представляющий из себя регулярное выражением. Этот regEx будет использоваться для того, чтобы найти соответствие задачи в пределах cronTab и удалить их.
public function remove_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); }
Если cronTab не будет пуст, то тогда посчитаем элементы в $cron_array, используя функцию count(). Полученное значение сохраним в переменной $original_count.
public function remove_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); $original_count = count($cron_array); }
Теперь у нас есть возможность узнать содержит ли $cron_jobs несколько значений или нет. Если да, то мы воспользуемся циклом foreach для обработки каждого значения. На каждом шаге будем использовать функцию preg_grep(). Эта изящная функция, мало чем отличается от preg_match(). В этом случае, однако, мы хотим получить элементы множества, которые не соответствуют шаблону. Таким образом, у нас будет множество всей cron работы, которой мы хотим сохранить!
public function remove_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); $original_count = count($cron_array); if (is_array($cron_jobs)) { foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); } else { } }
Если аргументом $cron_jobs не будет множество, то мы продолжим двигаться в почти такой же манере, но без циклов.
public functionremove_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); $original_count = count($cron_array); if (is_array($cron_jobs)) { foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); } else { $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT); } }
Далее мы сравним значение $cron_array с $original_count. Если длины будут идентичны, то мы просто вызовем метод remove_file(), чтобы удалить временный cron файл. Если они не будут соответствовать, то мы удалим существующий cronTab, а затем создадим новый!
public function remove_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); $original_count = count($cron_array); if (is_array($cron_jobs)) { foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); } else { $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT); } return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array); }
cron
Планировщик задач в Linux играет незаменимую роль в автоматизации администрирования операционной системы. Роль планировщика задач выполняет демон cron (crond — в некоторых дистрибутивах). Демон cron обычно запускается . После запуска, демон cron ежеминутно просматривает свои таблицы, в которых содержатся информация о периодичности запуска команд и запускает команды, когда значения полей минута, час, месяц и хотя бы одно из полей число и день_недели, совпадают с текущим временем. Основной конфигурационный файл демона cron — /etc/crontab:
cron:~#cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
В /etc/crontab задания выполняются с помощью команды run-parts, которая запускает скрипты и программы из указанных каталогов (/etc/cron.hourly, /etc/cron.daily и т.д.). Каждая строка запускает из соответствующего каталога задания ежечасно, ежедневно, еженедельно и ежемесячно, соответственно строкам сверху вниз
Обратите внимание, что все команды здесь запущены от имени пользователя root. Заметьте также, что crontab может содержать присваивания значений переменным shell, которые будут установлены перед запуском команды
Так же, если необходимо запускать какие-то команды по особому расписанию (не ежечасно, ежедневно, еженедельно и ежемесячно), то таблицы заданий помещаются в каталог /etc/cron.d/.
Каждый пользователь системы имеет свой файл заданий crontab, в котором описано, в какое время и какие программы запускать от имени этого пользователя. Для редактирования файла crontab используется специальная одноименная , позволяющая не прерывать процесс cron на время редактирования. Редактировать вручную таблицы cron не рекомендуется. Файлы таблиц планировщика cron для пользователей могут храниться в следующих каталогах:
/var/spool/cron — RedHat/var/spool/cron/crontabs — debian,ubuntu/var/spool/cron/tabs — SUSE
Каждая строка планировщика имеет следующий формат:
* * * * * {пользователь} выполняемая_команда - - - - - | | | | | | | | | ----- День недели (0 - 7) (Воскресенье =0 или =7) | | | ------- Месяц (1 - 12) (можно три буквы из названия месяца, | | | регистр не имеет значения от jan до dec) | | --------- День (1 - 31) | ----------- Час (0 - 23) ------------- Минута (0 - 59)
В примере показан формат одной из строки таблицы, состоящий из 7 полей. Первые 5 полей — это значения, задающие периодичность выполнения команды (расписание). 6-e поле присутствует только в таблицах /etc/crontab и др. расположенных в каталоге /etc/cron.d/. 7-е поле есть сама запускаемая команда. Командой может быть как простая команда, например, ls /proc >> /tmp/proc, или команда запуска написанного вами специального сценария. Со всей оставшаяся частью строки до символа перевода строки или символа %, будет выполнен вызов /bin/sh или другой оболочки, определенной в переменной SHELL в crontab. Знак процента (`%’ ) в команде (если он не экранирован обратной косой чертой (`\’ ) ) будет соответствовать символу перевода строки и все данные после первого `%’ будут посланы для команды на стандартный ввод.
Для указанных выше первых 5 полей, можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.
Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.
Косая черта (/) используется для определения шага значений. Если после диапазона указать /. Например, значение минут 0-59/2, определяет, что задание будет запущено каждую вторую минуту.
Вся оставшаяся часть строки до символа перевода строки или символа %, будет выполнен вызов /bin/sh или другой оболочки, определенной в переменной SHELL в crontab Знак процента (`%’ ) в команде (если он не экранирован обратной косой чертой (`\’ ) ) будет соответствовать символу перевода строки и все данные после первого `%’ будут посланы для команды на стандартный ввод.
Дополнительные переменные
При настройке Cron можно применять в командах специальные значения и сокращения. Например, для указания дня недели можно использовать следующий список:
- sun — воскресенье;
- mon — понедельник;
- tue — вторник;
- wed — среда;
- thu — четверг;
- fri — пятница;
- sat — суббота.
Для месяцев также имеются отдельные буквенные значения — jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec.
Также для настройки Cron имеются отдельные переменные, способные заменить целые строки команд:
- @reboot. Команда будет стартовать каждый раз при запуске компьютера;
- @yearly. Данная задача будет запускаться один раз в год. Эквивалентная ей запись в числовом виде может быть такой: 0 0 1 1 *. Ее синоним ещё можно записать как @annually;
- @monthly. Как можно догадаться из названия, данная переменная производит запуск команды раз в месяц. Ее числовой аналог — 0 0 1 * *;
- @weekly. Данная переменная будет запускаться каждую неделю;
- @dayly. Раз в день;
- @midnight. Запуск будет произведён в полночь;
- @hourly. Каждый час.
Примечания к работе с cron
1. При запуске скрипта из консоли вы можете указать одну из доступных версий php (5.3, 5.4, 5.6, 7.1, 7.2.), прописав путь до интерпретатора следующим образом: , где XX — нужная версия.
Например, чтобы запустить скрипт script.php из-под версии PHP 7.1, необходимо указать:
/opt/php71/bin/php /home/u/user/папка_сайта/public_html/script.php
(u и user — первая буква логина и сам логин).
2. При указании пути к интерпретатору версию php можно прописывать как с точкой, так и без нее: например, записи и равнозначны.
3. Если в задаче запускается скрипт, требующий переменные веб-сервера, запуск напрямую через PHP-интерпретатор приводит к ошибкам. Поэтому в случае, когда вы используете скрипт, работающий при запуске через адресную строку браузера, необходимо выбирать тип файла «HTTP-запрос» и указывать URL для запроса аналогично тому, как он указывается в адресной строке, например:
Со стороны специалистов поддержки Timeweb не оказываются консультации по исправлению кода скриптов для задач cron.
Варианты команд для планировщика
Конфигураций серверов множество и универсальной команды не существует. Некоторые серверы и хостинги используют разные версии PHP, что делаем составление крон задачи еще более сложным. Есть несколько команд, которые не завязаны на системное окружение и работают практически всегда:
wget -O /dev/null -q http://ваш-домен.ru/cron.php
curl -s http://ваш-домен.ru/cron.php > /dev/null
Следующие команды с использованием консольного PHP, следовательно путь должен быть указан согласно системного расположению файла :
php -f /полный_путь_до_tds/cron.php
php-cli /полный_путь_до_tds/cron.php > /dev/null
Примечание: Желательно запускать команды в консоли сервера, чтобы убедиться в их работоспособности
CRON по SSH
Настройка планировщика по ssh описана столько раз, что нового рассказать не получится.
Подключение по ssh подробно описано в справочном центре Timeweb:
http://timeweb.com/ru/help/pages/viewpage.action?pageId=4358354, поэтому на этом я не буду останавливаться.
После подключения, прочтите статью с информацией о командах ssh:
После прочтения надо найти файл со скриптом, перемещаясь между директориями командой cd. Найдя файл введите pwd и скопируйте путь (пример «/home/c/cc123456/public_html/test/»)
Если не знаете какие права у файла введите:
chmod 744 имя_файла
При подключении по ssh редактировать задачи можно командой
crontab -e
В первый раз сервер попросит выбрать редактор:
Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano 3. /usr/bin/mcedit 4. /usr/bin/vim.basic 5. /usr/bin/vim.tiny Choose 1-5 :
Система указывает на простой редактор nano под цифрой 2. Если не рассчитали силы или случайно выбрали vi, не пугайтесь, нажмите Esc, затем введите двоеточие q и нажмите enter.
Для того, чтобы сменить редактор, введите команду:
select-editor
и выберете nano.
Задания пишутся по строкам. Пример:
1 2 3 4 5 /opt/php56/bin/php /home/с/сс123456/public_html/twtest.php
Значения первых пяти значений:
- 1 минуты — число от 0 до 59
- 2 часы — число от 0 до 23
- 3 день месяца — число от 1 до 31
- 4 номер месяца в году — число от 1 до 12
- 5 день недели — число от 0 до 7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)
Для каждого параметра возможно задать необходимое количество значений через запятую. Например, если в поле «часы» написать 8,23, то задание будет запущено в 8 часов утра и в 23 часа вечера. Можно задать интервал: 9-18 будет означать, что программа запустится каждый час в период с 9 до 18 часов включительно. Символ ‘*’ означает «все возможные значения». Например, указание ‘*’ в поле «часы» будет означать «запускать каждый час». Символ ‘/’ служит для указания дополнительной периодичности задания. Например, ‘*/3’ в поле «минуты» означает «каждые три минуты».
Далее указываем путь до интерпретатора. На серверах Timeweb по умолчанию установлена версия php 5.3. Наш предполагаемый скрипт работает на 5.6. Указать требуемую версию php так:
"/opt/php*/bin/php" где php*/ = php53/ php5.3/ php54/ php5.4/ php56/ php5.6/ php70/ php7.0/ php71/ php7.1/
Последняя запись указывает на путь до файла и название файла, который запускаем.
Как работает крон (шаг за шагом)
-
При посещении любой страницы сайта (при любом запросе к сайту), в том числе при AJAX, REST запросах, т.е. всегда на событии срабатывает функция .
if ( ! defined( 'DOING_CRON' ) ) add_action( 'init', 'wp_cron' );
-
проверяет существует ли хоть одно задание с подошедшем временем. Если есть, то вызывает функцию .
-
запускает крон! Отправляет не блокирующий HTTP запрос на файл крона в котором передает текущую метку времени вида: , например: .
Тут проверяется, когда был в последний раз запущен крон, если менее 60 секунд, то функция ничего не делает. Изменить этот интервал можно через константу , указать в константе можно максимум 600 (10 минут), если указать больше, то она будет игнорироваться.
Далее проверяется есть ли хоть одно подошедшее задание, если есть то во временную опцию записывается текущая метка времени, когда был запущен крон и отправляется неблокирующий запрос на файл , там эта метка времени используется для разных проверок.
-
Файл опять проверяет: не запускался ли недавно крон (менее 60 сек назад), есть ли подошедшие крон задания.
Далее, проходит по всем «поспевшим» задачам и для каждого из них: удаляет текущую задачу из расписания, и если у задачи есть метка , (оно повторяющееся), создает новое такое же задание с помощью функции wp_reschedule_event(). Новое задание будет выполнено через указанный в интервале промежуток времени.
Далее, запускается указанный при регистрации крон задачи хук-событие, т.е. запускается текущее задание:
do_action_ref_array( $hook, $v );
Если обращаться к файлу напрямую, то он будет отрабатывать только раз в секунд (60 секунд).
Если в кроне много заданий и одно задание начало выполняться и выполняется так долго, что уже был отправлен очередной запрос на выполнение заданий крон, то очередная задача в первом крон запросе НЕ будет выполнена — первый запрос просто остановится после выполнения «долгой» задачи и очередные задания уже будут выполняться во втором запросе.
Заметки
Все крон задачи хранятся в опции .
Крон запрос запускается отдельно от текущей загрузки страницы и в нем отдельно грузится среда ВП и т.д. Текущий запрос (посещение страницы) только инициализирует крон (создает запрос на файл крона), если время подошло.
Другими словами: крон задачи выполняются асинхронно. Т.е. для выполнения ожидаемых крон задач, WordPress отправляет запрос на файл . Этот файл самодостаточный: он устанавливает константу , затем подгружает среду WordPress и выполняет все ожидаемые задачи.
Настройка планировщика заданий Cron
Необходимые к выполнению задания записываются в виде строк, в которых необходимо указать период включения и команду, указывающую, что именно необходимо запустить. Для каждого задания отводится отдельная строка. Например:
30 3 * * 2 /yourdirectory/myscript.pl
На более понятном простому пользователю языке тут обозначены: Минуты/Часы/ДеньМесяца/ДеньНедели/Команда. Данный пример означает, что в 3:30 ночи, каждый вторник, Сron должен запускать файл с названием youdirectory/myscript.pl.
Если перечислить значения через запятую, например в пункте «День» написать 2,4,6, то файл будет запускаться в указанное время каждый вторник, четверг и субботу.
Если задать значения через дефис, то задача будет исполняться в указанном интервале времени. Например, если в пункте «Часы» задать 3-7, то файл будет запускаться каждый час с 3 до 7 утра.
Также можно задать периодичность, написав в графе времени, например, в «Часы» /12. Тогда задача будет исполняться каждые 12 часов.
Важно знать, что «*» означает не отсутствие значения, а все возможные значения. То есть, если задать * * * * 1 /yourdirectory/myscript.pl, желая, чтобы файл запускался каждый понедельник, то это окажется совершенно неверным и файл будет запускаться каждую минуту
Еще одна важная особенность – это необходимость указания абсолютного пути к файлу. А также файлу необходимо иметь такие права доступа, чтобы он хотя бы мог запускаться.
Из представленных примеров становится понятно, что данный планировщик задач в Linux является очень удобным инструментом, поэтому предлагаем вам более подробно ознакомиться с некоторыми его особенностями.
Timeweb.ru
1. Зайдите в раздел «Crontab».
2. Добавьте задачу:
Тип файла ;
Периодичность ;
Нажмите на кнопку выбора файла, выберите cron.php
Затем добавьте перед строкой (обратите внимание на пробел между двумя частями команды).. В случае, если включили PHP 7.0 у сайта, используйте .
В случае, если включили PHP 7.0 у сайта, используйте .
Если не работает:
- Проверьте на странице «Настройки > Производительность», что хранилище для обработчика выбрано «Файлы» или «MySQL», но НЕ «Redis».
- На странице Crontab (в панели timeweb) включите уведомления на email (Кнопка «Указать ящик»). Так вы сможете плучать уведомления о работе крона.
Шаг 10. Собираем всё в кучу
Теперь давайте посмотрим, как пользоваться созданным нами детищем:
Установка соединения
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');
Создание одной задачи
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $crontab->append_cronjob('30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1');
Создание нескольких задач
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $new_cronjobs = array( '0 0 1 * * home/path/to/command/the_command.sh', '30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1' ); $crontab->append_cronjob($new_cronjobs);
Удаление одной задачи
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $cron_regex = '/home\/path\/to\/command\/the_command\.sh\/'; $crontab->remove_cronjob($cron_regex);
Удаление нескольких задач
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $cron_regex = array( '/0 0 1 \* \*/', '/home\/path\/to\/command\/the_command\.sh\/' ); $crontab->remove_cronjob($cron_regex);
Настройка Cron
Для настройки времени, даты и интервала когда нужно выполнять задание используется специальный синтаксис файла cron и специальная команда. Конечно, вы всегда можете отредактировать файл /etc/crontab, но этого делать не рекомендуется. Вместо этого, есть команда crontab:
Ее всегда желательно выполнять с опцией -e, тогда для редактирования правил будет использован ваш текстовый редактор по умолчанию. Команда открывает вам временный файл, в котором уже представлены все текущие правила cron и вы можете добавить новые. После завершения работы команды cron файл будет обработан и все правила будут добавлены в /var/spool/cron/crontabs/имя_пользователя причем добавленные процессы будут запускаться именно от того пользователя, от которого вы их добавляли.
Поэтому тут нужно быть аккуратным, и если вам нужно выполнять скрипты от рута, то и crontab нужно выполнить от рута, а не от пользователя. Это часто становиться причиной проблем.
Синтаксис crontab
Как я уже говорил, время задается особым синтаксисом, давайте рассмотрим синтаксис настройки одной задачи cron:
минута час день месяц день_недели /путь/к/исполняемому/файлу
Нужно сказать, что обязательно нужно писать полный путь к команде, потому что для команд, запускаемых от имени cron переменная среды PATH будет отличаться, и сервис просто не сможет найти вашу команду. Это вторая самая распространенная причина проблем с Cron. Дата и время указываются с помощью цифр или символа ‘*’. Этот символ означает, что нужно выполнять каждый раз, если в первом поле — то каждую минуту и так далее. Ну а теперь перейдем к примерам.
Примеры настройки cron
Сначала можно посмотреть задачи cron для суперпользователя, для этого можно воспользоваться опцией -l:
Вы можете удалить все существующие задачи командой -r:
Давайте предположим, что нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve. Какой-нибудь обслуживающий скрипт. Самый простой пример — запускать его каждую минуту:
Далее, усложним, будем запускать каждый час, в нулевую минуту:
Еще дальше:
Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:
Если идти так дальше, то можно запускать в первый день каждого месяца:
Можно в любой день, например, 15 числа:
В первый день недели первого месяца года, 0 часов 0 минут:
Или в нулевой день недели каждого месяца:
Вы можете выбрать любую минуту, час и день недели, например, 15.30 во вторник:
Понедельник считается первым днем, воскресенье — это седьмой или нулевой день. Еще можно писать сокращенное название дня недели, например sun — воскресенье:
Для того чтобы указать определенный интервал нужно использовать символ «-«, например, каждый час, с семи утра до семи вечера:
Если нужно запустить команду несколько раз, можно использовать разделитель «,». Например, запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:
Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта — «/»:
Кроме того, для некоторых часто используемых наборов были придуманы переменные, вот они:
- @reboot — при загрузке, только один раз;
- @yearly, @annually — раз год;
- @monthly — раз в месяц;
- @weekly — раз в неделю;
- @daily, @midnight — каждый день;
- @hourly — каждый час.
Например, вот так просто будет выглядеть команда запуска скрипта раз в час:
Если же вы собрались добавить скрипт в одну из папок, то, как я уже говорил, нужно чтобы его имя было без точек и у него были права на выполнение:
#!/bin/bash
……
Скрипт должен выглядеть подобным образом. Теперь вы знаете как настроить cron, осталось проверить как все работает.
Отладка работы
После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron, а иногда пишется в syslog. Например, у меня в crontab есть такая строка:
Она должна выполняться в 19.40 каждый день, теперь смотрим лог:
И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут же было бы выведено сообщение.
Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:
Дальше вы увидите весь вывод, включая вывод скрипта и сможете быстро понять в чем проблема.