Введение
Размещая сайт, мы желаем добиться бесперебойной работы без нашего участия.
Значит, требуется автоматизировать процессы, и тут на помощь приходит cron.
Cron - программа, демон для автоматического запуска программ и скриптов на сервере в необходимое время.
Crontab в панели управления Timeweb
Если ваш аккаунт оплачен, и вас не уличили в спам-рассылке, то раздел Crontab доступен и работоспособен:
Интерфейс Crontab в панели управления Timeweb дружелюбен и интуитивно понятен: даже начинающие пользователи, до этого не имевшие опыта работы с cron, легко разберутся в том, как создавать задачи. Создав задачу, вы сможете в автоматическом режиме делать бэкапы, рассылки, чистить кэш и выполнять другие типовые действия.
Crontab в панели управления Timeweb поможет любому пользователю автоматизировать свои задачи и достичь нужный ему результат.
После основной информации я расскажу о нюансах, которые важно учитывать при работе с cron.
В разделе Crontab создаются новые задачи. Для этого потребуется заполнить поля:
- Название. Это имя нашей задачи.
- Тип файла и путь до файла. В зависимости от того, на каком языке написан сценарий, выбираем тип файла и путь до него. Если в задаче запускается скрипт, требующий переменные веб-сервера, запуск напрямую через php-интерпретатор приводит к ошибкам. Поэтому в случае, когда Вы используете скрипт, работающий при запуске через адресную строку браузера, необходимо выбирать тип файла "HTTP-запрос" и указывать URL для запроса аналогично тому, как он указывается в адресной строке "ваш_сайт/путь/до/скрипта/script.php?параметр1=значение1&параметр2=значение2".
- Периодичность запуска. Популярные интервалы запуска выбираем из списка. Если необходим запуск в другое время, то используем продвинутые настройки. В отличие от консоли, в панели Timeweb время указывается в обратном порядке. Но каждый блок подписан, что помогает не запутаться.
При необходимости указывайте один ящик администратора в разделе 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/
Последняя запись указывает на путь до файла и название файла, который запускаем.
Нюансы
- При изменении в панели управления в разделе "Crontab" удалятся изменения записей сделанных по ssh!
- Если определены оба поля "день месяца" и "день недели" , то такое задание будет выполняться в каждый указанный день недели независимо от дня месяца. Например, следующая команда будет выполняться в 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". Удачи!
Комментарии
Создал sh скрипт по инструкции.
Тип "Исполняемый бинарный файл"
В поле “Путь” прописал:
/home/d/my_account/tmp1/twtest.sh /opt/php74/bin/php /home/d/my_account/public_html/script.php
в итоге получаю ошибку:
/bin/sh: 1: /home/d/my_account/tmp1/twtest.sh: not found
Вместо "/my_account/" соответственно, настоящий юзернейм, папка и файл существуют, права выставил 755