Cron. Выполнение каждую минуту.
Добрый вечер ЛОР.
Имеется скрипт, который надо выполнять каждую минуту. Почитав маны по крону, понял, что крутить надо через crontab, но как ?
Попробовал написать так
О, сорри за дублирование. Ты был более быстр. 🙂
Повторение — мать учения ☺
Наверно я криворукий, но . не работает :(. Сам cron в Ubuntu надо куда-то заталкивать или он из коробки автоматически запускается ?
Какой именно у тебя крон? fcron запросто умеет это.
@ 1 в нём, если что.
Самый обычный cron, который в бубне из коробки. Да и хочется разобраться с ним.
если написать там просто 1 — не работает
если написать там просто 1, это будет означать: «каждый раз, как минута равняется 1». То есть в 0:01, 1:01, 2:01, 3:01 и так далее.
Про убунту не знаю, там всё не по-людски. Но должно быть из коробки, как же без крона-то?
Должен быть в таблице процессов.
Пять звёзд, команда. Это должно работать. Крон читает файл раз в минуту и выполняет строку при совпадении времени с шаблонами. * * * * * проходит каждый раз.
Судя по выхлопу имеется
А что значит «не выполняет»?
Cron ничего на stdout не выводит, он молча выполняет скрипт, а результат внутрисистемным мылом шлёт владельцу crontab’а.
Запусти mail, там наверняка сообщения о выполнении твоего скрипта имеются. И в большо-ом количестве. 🙂
Права на выполнение у скрипта есть 🙂
Для теста пока подсунул скрипт на смену обоин — не меняет =_=
Сейчас попробую ваш вариант.
смотри mail или в логах же
вангую проблемы с переменными окружения
В syslog от самого крона ничего нет. Только crontab с сообщениями о редактировании *листа*
Вообщем как правильно:
Переключись на пользователя из под которого это должно выполнять:
su — USERNAME
Потом:
crontab -e
В выскачившем редакторе добавь в файл:
*/1 * * * * /home/rainx/wp.sh >/dev/null 2>/dev/null
Сохрани.
cron передергивать не нужно.
Последние перенаправления нужны что-бы на твое мыло каждый раз не падал выхлоп скрипта.
unixway однако.
Проделал все и . 0 результат . ЧЯДНТ ? 🙁
Ну ты mail-то запускал? Что в полученных сообщениях написано? Что тебе товарищ cron докладывает?
Если ничего, то скорее всего, как тут выше уже предполагали, что-то не так с переменными среды.
В /var/spool/cron/crontabs/ твой файл с этой строчкой появился?
отличный тест, братюнь
9 из 10 не понимают что * и */1 это одно и то же
Пишете, надеюсь, через crontab -e?
Именно так и писал . Проблема не решена, просто я забил на это 😀
Источник
Скрипты и планировщик задач в ОС Linux
В данном посте обсуждаются базовые принципы написания скриптов и работа планировщика заданий в Oracle Linux. Рассматриваются следующие вопросы:
- Скрипты в ОСLinux
- Что такое планировщик заданий
- Работа сервисаcron
- Примеры
1. Скрипты в ОС Linux
Скрипты в ОС на базе Linux – это набор команд, записанных в файл. Это делается с целью быстрого и удобного вызова последовательности этих команд. Скрипты могут выполнять самые разные задачи – от автоматизации рутинных действий системного администратора до реализации сложных алгоритмов для ИТ инфраструктуры. При этом результаты работы команд могут служить входными данными для других задач (команд).
Для того, чтобы превратить файл с набором команд в скрипт, понадобятся две вещи. Во-первых, в первой строке пустого файла необходимо прописать путь к командной оболочке, которая будет исполнять данный файл. В большинстве дистрибутивов Linux данной оболочкой является Bash, и соответственно первой строкой будет #!/bin/bash. В других строках символ решетки используется для обозначения комментариев, которые не будут обработаны оболочкой. Однако, первая строка — это особый случай, здесь решетка, за которой следует восклицательный знак (эту последовательность называют шебанг) и путь /bin/bash, указывают системе что данный скрипт создан именно для оболочки bash. Во вторых, чтобы скрипт запустить как исполняемый файл, ему необходимо дать права на исполнение, иначе, попытка его запуска даст ошибку Permission denied.
Пример ошибки, когда запускается неисполняемый файл:
Права на исполнение даются командой chmod. Например,
chmod +x filename.sh
Данная команда дает всем пользователям операционной системы право на запуск файла с именем filename.sh
Право на запуск того же файла только владельцу можно дать следующей командой: chmod u+x filename.sh.
Расширение .sh не обязательно, но таким образом легче определять, какой файл является скриптом.
Ниже рассматривается пример написания простейшего скрипта, копирующего все файлы из папки /home/rustam/Documents в папку /tmp/backup.
При работе со скриптами могут использоваться переменные. Они позволяют хранить в файле сценария различную информацию, например, результаты работы одних команд для дальнейшего их использования для других команд.
Исполнение отдельных команд без хранения результатов работы ограничивают их возможности.
Существуют два типа переменных, которые используются в bash-скриптах:
Используются при необходимости работы с системными данными в командах оболочки. Например, требуется вывести домашнюю директорию текущего пользователя. Список переменных для среды конкретного пользователя выдается командой env.
Можно использовать системную переменную $HOME в двойных кавычках, что не помешает ее распознаванию системой.
В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в скрипте свои собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария. Как и в случае с системными переменными, к пользовательским переменным обращаются используя знак доллара:
Дополним соответствующим образом скрипт, написанный ранее – добавляется переменная для хранения пути к папке, в которую осуществляется копирование.
2. Что такое планировщик заданий. Работа сервиса cron.
Часто возникают ситуации, в которых приходится автоматизировать различные задачи по обслуживанию и работе с Linux с помощью скриптов. В этом случае удобно, если скрипт выполняет необходимые команды без участия пользователя. Для этого настраивается автоматический запуск требуемого скрипта в заданное время.
Для указанной настройки в Linux используется системный сервис cron. Это планировщик, который позволяет выполнять необходимые скрипты раз в час, раз в день, неделю или месяц, а также в любое заданное время или через любой интервал времени. Сервис cron также часто используется другими службами операционной системы.
Как и большинство других сервисов Linux, cron запускается при старте системы и работает в фоновом режиме. Его основная задача – выполнять требуемые процессы в заданное время. Существует несколько конфигурационных файлов, из которых берется информация о том, что и когда нужно выполнять. Cron открывает файл /etc/crontab, в котором указываются необходимые данные.
Для настройки времени, даты и интервала выполнения задания, используется специальный синтаксис файла cron и специальная команда. Не рекомендуется непосредственно редактировать файл /etc/crontab. Вместо этого используется команда crontab. Ниже запускается команда crontab с ключом –e для редактирования файла
Рекомендуется ее выполнять с опцией -e, тогда для редактирования правил используется текстовый редактор по умолчанию. После выполнения команды открывается временный файл, в котором записаны текущие правила cron и есть возможность добавлять новые. Добавленные правила запускаются именно от того пользователя, от имени которого они были добавлены.
Файлы crontab, используемые для управления работой планировщика, располагаются в каталоге /etc/cron.d/. Кроме того, в каталогах /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ размещаются автоматически запускаемые программы (ежедневно, еженедельно или ежемесячно).
Вывод содержимого текущего файла позволяет команда:
Таблица crontab состоит из 6 колонок, которые разделяются пробелами или табуляторами. Первые пять колонок отвечают за время выполнения, соответственно, минута, час, день месяца, месяц, день недели. В них может находиться: число, список чисел (1,2,3), диапазон чисел (1-3), символы * или /. Все остальные символы в строке интерпретируются как выполняемая команда с ее параметрами – можно указать как саму команду (например, echo “Доброе утро”), так и путь к исполняемому скрипту.
Как запускать скрипты через cron
Скрипты запускаются через cron, указанием команды либо пути к скрипту в последней колонке.
Обязательно требуется прописывать полный путь к команде, так как для команд, запускаемых от имени сервиса cron, переменная пользовательской среды PATH будет отличаться, и сервис не сможет найти команду.
Пример запуска ранее созданного скрипта filename.sh, который копирует файлы каждый день в 23:00:
или копирует файлы каждые 5 минут:
3. Примеры
Ниже приведены примеры настройки и работы cron:
0 17 * * 1-5 echo “Рабочий день закончен – эта надпись выводится в 17:00 с понедельника по пятницу”
15 6 * * sun echo “Выполняется в 6:15 в воскресенье”
30 12,13 * * 1,3 echo “Эта надпись выводится в понедельник и среду в 12:30 и 13:30”
Источник
Как запускать cron чаще, чем раз в минуту при помощи PHP
Классический конфиг — файл с записями cron jobs в операционной системе Linux, выглядит следующим образом:
Первые пять параметров означают время выполнения этой задачи, а шестой — сама команда, которую необходимо запустить. Параметры времени — это: минуты, часы, дни, месяцы и день недели. Причем все числа должны быть представлены в виде целых чисел либо в виде специального синтаксиса.
В итоге, минимально возможный интервал запуска команды — это один раз в минуту.
Для многих задач выполнение команды нужно намного чаще, например раз в 10 секунд. Для некоторых задач по автоматизации бизнес процессов максимально допустимая задержка часто составляет не более чем 1-1.5 секунды.
Разумеется, классический cron для этого не подходит — его нужно усовершенствовать.
Ниже представлена пошаговая реализация по созданию дополнительного функционала (на языке PHP) к классическому cron на Linux с применением дополнительной защиты от повторного запуска процессов.
Постановка задачи и настройка cron
Для примера будем использовать следующую задачу:
- Во фронт-энде пользователь может инициировать выполнение какой-то сложной задачи путем нажатия кнопки «Запуск»;
- Бек-энд после записи новой строки в базу данных сообщает пользователю подтверждение;
- Через cron мы будем «отслеживать» такие новые задачи и выполнять их максимально быстро, чтобы пользователь получил результат не через минуту, а моментально*.
*Если использовать запуск команд, как раз в минуту, то выполнение задачи начнется тогда, когда секунды дойдут до ближайшего нуля (начало новой минуты). Следовательно, в классическом виде пользователю нужно будет ожидать выполнение от 0 до 59 секунд.
Итак, cron настроим в его максимальном виде, т.е. раз в минуту:
Выполнение одного цикла
Изначально следует определиться, с какой частотой мы будем запрашивать новые задачи в базе данных — в зависимости от этого будет меняться количество циклов и логический сон (функция sleep )
В текущем примере используется шаг равный 10 секундам. Следовательно количество циклов 60 / 10 = 6. Итого, общий код выглядит следующим образом:
Уточнение: в данном примере используется шаг равный 10 секундам, который может обеспечить минимальный интервал выполнения скрипта один раз в 10 секунд. Соответственно, для более частого выполнения следует изменить количество циклов и «время на сон».
Как избежать повторного выполнения задачи
В представленном виде есть одна неопределенность, а именно — повторное выполнение задачи в случае, если она уже начата. Это становится особенно актуально, если задача «сложная» и требует несколько секунд на ее реализацию.
Таким образом создается проблема повторного выполнения:
- Функция solve_one_task() уже запущена, но еще не завершила свою работу;
- Следовательно, в базе данных до сих пор задача отмечена как невыполненная;
- Следующий цикл опять получит эту задачу и запустит функцию solve_one_task() еще раз, с этой же самой задачей.
Разумеется, это можно решить, например, изменением какого-то статуса в базе данных по этой задаче.
Но мы не будем нагружать базу данных: исходя из моего тестирования, MYSQL может принять запрос, но обработать его не сразу. Различие даже в 0.5 секунд может привести к повторному выполнению — что категорически не подходит.
Также в данном случае речь идет всего лишь про статусы задач, поэтому лучше будем использовать файловую систему сервера.
Основная модель проверки строится при помощи flock — функции, которая ставит и снимает блокировку с файла.
В исполнении PHP работу функции можно представить следующим образом:
Результат
Общий вид всего цикла выглядит следующим образом:
Таким образом, подобный алгоритм позволяет запускать цикличное выполнение обработки задач и не беспокоится, что задача будет обработана более одного раза.
И теперь достаточно просто запускать этот код через cron каждую минуту, а он в свою очередь, будет запускать более мелкие циклы уже внутри себя.
Источник