Cron: настройка и запуск

8 комментариев
Cron: настройка и запуск

Введение

Размещая сайт, мы желаем добиться бесперебойной работы без нашего участия.

Значит, требуется автоматизировать процессы, и тут на помощь приходит cron.

Cron - программа, демон для автоматического запуска программ и скриптов на сервере в необходимое время.

Crontab в панели управления Timeweb

Если ваш аккаунт оплачен, и вас не уличили в спам-рассылке, то раздел Crontab доступен и работоспособен:Crontab в панели управления Timeweb

Интерфейс Crontab в панели управления Timeweb дружелюбен и интуитивно понятен: даже начинающие пользователи, до этого не имевшие опыта работы с cron, легко разберутся в том, как создавать задачи. Создав задачу, вы сможете в автоматическом режиме делать бэкапы, рассылки, чистить кэш и выполнять другие типовые действия.

Crontab в панели управления Timeweb поможет любому пользователю автоматизировать свои задачи и достичь нужный ему результат.

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

В разделе Crontab создаются новые задачи. Для этого потребуется заполнить поля:

  • Название. Это имя нашей задачи.
  • Тип файла и путь до файла. В зависимости от того, на каком языке написан сценарий, выбираем тип файла и путь до него. Если в задаче запускается скрипт, требующий переменные веб-сервера, запуск напрямую через php-интерпретатор приводит к ошибкам. Поэтому в случае, когда Вы используете скрипт, работающий при запуске через адресную строку браузера, необходимо выбирать тип файла "HTTP-запрос" и указывать URL для запроса аналогично тому, как он указывается в адресной строке "ваш_сайт/путь/до/скрипта/script.php?параметр1=значение1&параметр2=значение2".
  • Периодичность запуска. Популярные интервалы запуска выбираем из списка. Если необходим запуск в другое время, то используем продвинутые настройки. В отличие от консоли, в панели Timeweb время указывается в обратном порядке. Но каждый блок подписан, что помогает не запутаться.Новая задача Cron

При необходимости указывайте один ящик администратора в разделе Crontab. На этот ящик будут приходить сообщения в том случае, если бы при запуске скрипта в консоли появилось бы сообщение.

Нюансы

Небольшие нюансы, о которых стоит помнить при работе с cron.

1. Cron работает, если аккаунт оплачен и нет ограничений.

Проверить статус можно создав файл с расширением php (например twtest.php) с кодом:

<?php echo exec('id'); ?>

И обратившись к файлу в браузере.

В браузере увидите информацию:

uid=12345(login) gid=600(customers) groups=600(customers) - говорит о том, что cron и почта доступны

uid=12345(login) gid=600(customers) groups=601(newcustomers),600(customers),660(spammers) - пишем в поддержку

2. Файл, который запускаете, должен иметь права на чтение и исполнение (r+x).

По умолчанию файлы на хостинге создаются с правами 600. Поменять права на нужные можно по ssh командой:

chmod 744 twtest.php

или в Файловом менеджере, об этом у Timeweb есть инструкция: http://timeweb.com/ru/help//pages/viewpage.action?pageId=4358487

3. Дабы не захламлять e-mail лишними письмами, настройте часто исполняемые скрипты на запись лога в файл, а не в консоль.

CRON по SSH

Настройка планировщика по ssh описана столько раз, что нового рассказать не получится.

Подключение по ssh подробно описано в справочном центре Timeweb:

http://timeweb.com/ru/help/pages/viewpage.action?pageId=4358354, поэтому на этом я не буду останавливаться.

После подключения, прочтите статью с информацией о командах ssh:

http://timeweb.com/ru/help/pages/viewpage.action?pageId=4358246

После прочтения надо найти файл со скриптом, перемещаясь между директориями командой 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       <---- easiest

3. /usr/bin/mcedit

4. /usr/bin/vim.basic

5. /usr/bin/vim.tiny

Choose 1-5 [2]:

Система указывает на простой редактор 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/

Последняя запись указывает на путь до файла и название файла, который запускаем.

Нюансы

  1. При изменении в панели управления в разделе "Crontab" удалятся изменения записей сделанных по ssh!
  2. Если определены оба поля "день месяца" и "день недели" , то такое задание будет выполняться в каждый указанный день недели независимо от дня месяца. Например, следующая команда будет выполняться в 9 часов 19 минут каждую среду и каждое 7 число месяца, даже если 7 число не совпадает со средой.
19 9 7 * 3 /opt/php56/bin/phpn  /home/с/сс123456/public_html/twtest.php

Частные случаи

Для запуска задачи чаще, чем раз в минуту, используем 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 [[ -e $pidfile ]]

then

    pid=`cat $pidfile 2>/dev/null`

    ps h $pid >/dev/null 2>/dev/null

    if [[ $? -eq 0 ]]

    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 - путь до нашего скрипта

Указываем необходимое время запуска и придумываем название.

Заключение

Теперь вы знаете, как работать с cron и автоматически запускать задачи. Более подробную информацию о cron ищите в "man cron". Удачи!

Использовать планировщик задач вы можете на любом тарифе хостинга Timeweb: https://timeweb.com/ru/services/hosting/

Комментарии

Лавр Иванов +120
20 дек в 2017
Виктор, отличные советы, взял на вооружение
Саша Иванов +1
01 марта в 2018
+
Сергей Грищенко +1
16 июля в 2018
Подскажите, этот скрипт "/home/c/cc123456/tmp/twtest.sh" не даёт запустить скрипт еще раз, если он еще не был выполнен? Я верно понял?
Свернуть ответы
Комментарий автора
Виктор Коноплев +38
16 июля в 2018
Да, этот скрипт не даёт запустить выполнение задачи повторно, если задача еще выполняется
Сергей Грищенко +1
17 июля в 2018
Спасибо! А он её отменяет или ждет, пока будет заверешена предыдущая?
Комментарий автора
Виктор Коноплев +38
17 июля в 2018
Лок файл не даст запустить задачу. Т.е. отменяет
Сергей Кигинько 0
08 авг в 2018
Добрый день. Подскажите пожалуйста, а файл lock должен периодически обновляться? Т.е. появляется и удаляется по завершению выполнения скрипта?
Комментарий автора
Виктор Коноплев +38
08 авг в 2018
Да, лок файл создаётся при запуске скрипта и удаляется скриптом.
С помощью соцсетей
У меня нет аккаунта Зарегистрироваться
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
С помощью соцсетей
У меня уже есть аккаунт Войти
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
Инструкции по восстановлению пароля высланы на Ваш адрес электронной почты.
Пожалуйста, укажите email вашего аккаунта
Ваш баланс 10 ТК
1 ТК = 1 ₽
О том, как заработать и потратить Таймкарму, читайте в этой статье
Чтобы потратить Таймкарму, зарегистрируйтесь на нашем сайте