- Как выполнить задачу по расписанию в Linux.
- Crontab
- Запуск скриптов по расписанию
- ИТ База знаний
- Полезно
- Навигация
- Серверные решения
- Телефония
- Корпоративные сети
- Планировщик CRON — запуск программ по расписанию
- Про Linux за 5 минут
- Что такое файл Crontab
- Синтаксис Crontab и операторы
- Общесистемные файлы Crontab
- Предопределенные макросы
- Команда Crontab
- Переменные Crontab
- Ограничения Crontab
- Примеры Cron заданий
- Кунг-фу стиля Linux: запуск команд
- Запуск команд из командной оболочки
- Планирование запуска команд в определённое время
- Пакетное выполнение задач
- Итоги
Как выполнить задачу по расписанию в Linux.
Crontab
Для таких целей в Linux имеется crontab. Он запускает ваши скрипты на выполнение в указанное время.
В системе имеется главный файл (назовем его так) crontab, который запускает на выполнение скрипты Linux.
Настройка crontab
Откроем этот файл.
vi /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/cron.*) есть скрипты, которые будут запущены, в зависимости от времени указанного в левой части.
Например запись 42 4 1 * * root run-parts /etc/cron.monthly —> выполняется 1-го числа каждого месяца в 4 часа 42 минуты.
Синтаксис crontab
* * * * *
* * * * * День недели (от 0 до 6, где 6 = воскресенье, можно задавать как цифрами так и tue thu)
* * * * * Месяц (от 1 до 12)
* * * * * День месяца (от 1 до 31)
* * * * * Час (от 0 до 23)
* * * * * Минута (от 0 до 59)
Создадим запись crontab
Здесь мы создадим свой файлик crontab.
Для этого необходимо открыть его на запись при помощи crontab -e
Вставить запись
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
10 6 * * 0 /root/sh/rsync-wek.sh
В результате получили выполнение скрипта (по адресу /root/shrsync-wek.sh) каждое воскресенье в 6 часов 10 минут.
Cкрипт rsync-wek.sh должен иметь права на выполнение.
Примеры crontab
*/2 * * * * каждые 2 минуты
2 * * * * каждый час на 2 минуте (в 1 час и 2 минуты в 2часа и 2 минуты и т.д.)
2 * * * 0 будет выполняться на протяжении всего воскресенья каждый час на 2 минуте.
0 0 1 1 * каждый год 31 декабря в 0 часов 0 минут.
Удалить запись crontab -r
Просмотреть crontab -l
crontab -e изменить.
Записи будут сохранены в vi /var/spool/cron/root (в зависимости от того пользователя под которым была создана запись crontab)
Источник
Запуск скриптов по расписанию
Планирование однократного запуска скриптов с использованием команды at способно облегчить жизнь во многих ситуациях. Но как быть, если нужно, чтобы скрипт выполнялся в одно и то же время ежедневно, или раз в неделю, или раз в месяц?
В Linux имеется утилита crontab, позволяющая планировать запуск скриптов, которые нужно выполнять регулярно.
Crontab выполняется в фоне и, основываясь на данных в так называемых cron-таблицах, запускает задания по расписанию.
Для того, чтобы просмотреть существующую таблицу заданий cron, воспользуйтесь такой командой:
При планировании запуска скрипта по расписанию crontab принимает данные о том, когда нужно выполнить задание, в таком формате:
минута, час, день месяца, месяц, день недели.
Например, если надо, чтобы некий скрипт с именем command выполнялся ежедневно в 10:30, этому будет соответствовать такая запись в таблице заданий:
30 10 * * * command
Здесь универсальный символ «*», использованный для полей, задающих день месяца, месяц и день недели, указывает на то, что cron должен выполнять команду каждый день каждого месяца в 10:30.
Если, например, надо, чтобы скрипт запускался в 4:30PM каждый понедельник, понадобится создать в таблице заданий такую запись:
30 16 * * 1 command
Нумерация дней недели начинается с 0, 0 означает воскресенье, 6 — субботу.
Вот ещё один пример. Здесь команда будет выполняться в 12 часов дня в первый день каждого месяца.
00 12 1 * * command
Нумерация месяцев начинается с 1.
Для того чтобы добавить запись в таблицу, нужно вызвать crontab с ключом -e:
Затем можно вводить команды формирования расписания:
30 10 * * * /home/likegeeks/Desktop/myscript
Благодаря этой команде скрипт будет вызываться ежедневно в 10:30.
Если вы столкнётесь с ошибкой «Resource temporarily unavailable», выполните нижеприведённую команду с правами root-пользователя:
$ rm -f /var/run/crond.pid
Организовать периодический запуск скриптов с использованием cron можно ещё проще, воспользовавшись несколькими специальными директориями:
Если поместить файл скрипта в одну из них, это приведёт, соответственно, к его ежечасному, ежедневному, еженедельному или ежемесячному запуску.
Источник
ИТ База знаний
Курс по Asterisk
Полезно
— Узнать IP — адрес компьютера в интернете
— Онлайн генератор устойчивых паролей
— Онлайн калькулятор подсетей
— Калькулятор инсталляции IP — АТС Asterisk
— Руководство администратора FreePBX на русском языке
— Руководство администратора Cisco UCM/CME на русском языке
— Руководство администратора по Linux/Unix
Навигация
Серверные решения
Телефония
FreePBX и Asterisk
Настройка программных телефонов
Корпоративные сети
Протоколы и стандарты
Планировщик CRON — запуск программ по расписанию
Время планировать задачи
Cron — это демон планирования, который выполняет задачи с заданными интервалами. Эти задачи называются заданиями cron и в основном используются для автоматизации обслуживания или администрирования системы.
Мини — курс по виртуализации
Знакомство с VMware vSphere 7 и технологией виртуализации в авторском мини — курсе от Михаила Якобсена
Например, вы можете установить задание cron для автоматизации повторяющихся задач, таких как резервное копирование баз данных или данных, обновление системы последними обновлениями безопасности, проверка использования дискового пространства, отправка электронных писем, перезагрузка сервера и так далее. В некоторых приложениях, таких как Drupal или Magento, для выполнения определенных задач требуются задания cron.
Задания cron могут быть запланированы по минуте, часу, дню месяца, месяцу, дню недели или любой их комбинации.
Про Linux за 5 минут
Что такое файл Crontab
Crontab (таблица cron) представляет собой текстовый файл, который определяет расписание заданий cron. Существует два типа файлов crontab. Общесистемные файлы crontab и отдельные пользовательские файлы crontab.
Файлы crontab пользователей именуются в соответствии с именем пользователя, и их расположение зависит от операционной системы. В дистрибутивах на основе Red Hat, таких как CentOS, файлы crontab хранятся в каталоге /var/spool/cron , а файлы Debian и Ubuntu хранятся в каталоге /var/spool/cron/crontabs .
Хотя вы можете редактировать пользовательские файлы crontab вручную, рекомендуется использовать команду crontab .
/etc/crontab и файлы в каталоге /etc/cron.d являются общесистемными файлами crontab, которые могут редактировать только системные администраторы.
В большинстве дистрибутивов Linux вы также можете помещать скрипты в каталоги /etc/cron.
Синтаксис Crontab и операторы
Каждая строка в пользовательском файле crontab содержит шесть полей, разделенных пробелом, за которым следует команда для запуска.
Первые пять полей могут содержать одно или несколько значений, разделенных запятой или диапазон значений, разделенных дефисом.
- * — оператор звездочки означает любое значение или всегда. Если в поле «Час» имеется символ звездочки, это означает, что задание будет выполняться каждый час.
- , — оператор запятой позволяет указать список значений для повторения. Например, если у вас есть 1,3,5 в поле Час, задание будет выполняться в 1, 3 и 5 часов утра.
- — — оператор дефиса позволяет указать диапазон значений. Если в поле «День недели» указано значение 1–5, задание будет выполняться каждый рабочий день (с понедельника по пятницу).
- / — оператор косой черты позволяет указать значения, которые будут повторяться в течение определенного интервала между ними. Например, если в поле «Час» указано */4 , это означает, что действие будет выполняться каждые четыре часа. Это то же самое, что указание 0,4,8,12,16,20. Вместо звездочки перед оператором косой черты можно также использовать диапазон значений, 1-30/10 означает то же, что и 1,11,21.
Общесистемные файлы Crontab
Синтаксис общесистемных файлов crontab немного отличается от пользовательских crontabs . Он содержит дополнительное обязательное поле пользователя, которое указывает, какой пользователь будет запускать задание cron.
Предопределенные макросы
Существует несколько специальных макросов расписания Cron, используемых для определения общих интервалов. Вы можете использовать эти ярлыки вместо указания даты в пять столбцов.
- @yearly (или @annually ) — запускать задание один раз в год в полночь (12:00) 1 января. Эквивалент 0 0 1 1 * .
- @monthly — запускать заданное задание один раз в месяц в полночь первого дня месяца. Эквивалент 0 0 1 * * .
- @weekly — запускать задание раз в неделю в полночь воскресенья. Эквивалент 0 0 * * 0 .
- @daily — запускать задание один раз в день в полночь. Эквивалент 0 0 * * * .
- @hourly — запускать заданную задачу один раз в час в начале часа. Эквивалент 0 * * * *.
- @reboot — Запустить указанное задание при запуске системы (время загрузки).
Команда Crontab
Команда crontab позволяет установить или открыть файл crontab для редактирования. Вы можете использовать команду crontab для просмотра, добавления, удаления или изменения заданий cron, используя следующие параметры:
- crontab -e — отредактировать файл crontab или создать его, если он еще не существует.
- crontab -l — Показать содержимое файла crontab.
- crontab -r — удалить текущий файл crontab.
- crontab -i — Удалить текущий файл crontab с запросом перед удалением.
- crontab -u — Изменить другой файл crontab. Требуются права системного администратора.
Команда crontab открывает файл crontab с помощью редактора, указанного в переменных окружения VISUAL или EDITOR .
Переменные Crontab
Демон cron автоматически устанавливает несколько переменных окружения.
- Путь по умолчанию установлен в PATH=/usr/bin:/bin . Если вызываемая вами команда присутствует в указанном пути cron, вы можете использовать абсолютный путь к команде или изменить переменную cron $PATH . Вы не можете неявно добавить :$PATH , как если бы вы использовали обычный скрипт.
- Оболочка по умолчанию установлена в /bin/sh . Вы можете установить другую оболочку, изменив переменную SHELL .
- Cron вызывает команду из домашнего каталога пользователя. Переменная HOME может быть переопределена настройками в crontab.
- Уведомление по электронной почте отправляется владельцу crontab. Чтобы перезаписать поведение по умолчанию, вы можете использовать переменную среды MAILTO со списком (через запятую) всех адресов электронной почты, которые вы хотите получать по электронной почте. Если MAILTO определено, но пусто (MAILTO = «») , письмо не отправляется.
Ограничения Crontab
Системные администраторы могут контролировать, какие пользователи имеют доступ к команде crontab , используя файлы /etc/cron.deny и /etc/cron.allow . Файлы состоят из списка имен пользователей, по одному имени пользователя в строке.
По умолчанию только файл /etc/cron.deny существует и является пустым, что означает, что все пользователи могут использовать команду crontab . Если вы хотите запретить доступ к командам crontab конкретному пользователю, добавьте имя пользователя в этот файл.
Если файл /etc/cron.allow существует, только пользователи, перечисленные в этом файле, могут использовать команду crontab . Если ни один файл не существует, только пользователи с правами администратора могут использовать команду crontab .
Примеры Cron заданий
Ниже приведены некоторые примеры заданий cron, которые покажут вам, как запланировать выполнение задачи на разные периоды времени.
- Запускать команду в 15:00 каждый день с понедельника по пятницу:
- Запускать скрипт каждые 5 минут и перенаправлять стандартный вывод на dev null , на указанный адрес электронной почты будет отправлена только стандартная ошибка:
- Выполнять две команды каждый понедельник в 3 часа дня (используйте оператор && между командами):
- Запускать PHP-скрипт каждые 2 минуты и записывать результат в файл:
- Запускать сценарий каждый день, каждый час, каждый час, с 8:00 до 16:00:
- Запускать сценарий в первый понедельник каждого месяца в 7 часов утра.
- Запускать сценарий в 21:15, 1 и 15 числа каждого месяца:
- Установить пользовательские переменные HOME , PATH , SHELL и MAILTO и запускать команду каждую минуту.
Мини — курс по виртуализации
Знакомство с VMware vSphere 7 и технологией виртуализации в авторском мини — курсе от Михаила Якобсена
Источник
Кунг-фу стиля Linux: запуск команд
Одна из особенностей Linux- и Unix-подобных операционных систем, возможность мощная, но, в то же время, вызывающая немало путаницы, заключается в том, что в этих системах до одной и той же цели можно добраться разными путями. Возьмём, например, что-то простое, вроде запуска последовательностей команд. Как это сделать? Пожалуй, самый очевидный ответ на этот вопрос заключается в написании shell-скрипта. Это — потрясающе гибкий подход к решению подобной задачи. Но что если нужно всего лишь запустить несколько команд, по возможности ничем не усложняя себе жизнь? Выглядит такая задача весьма простой, но существует множество способов решить её — от простого ввода этих команд в командной строке, до планирования их запуска. За выполняющимися командами, кроме того, можно наблюдать, организовав мониторинг очереди задач так, как он может быть организован на мейнфрейме.
Поговорим о запуске команд в Linux, рассмотрим несколько способов запуска последовательностей команд из bash (и из многих других оболочек Linux). Здесь мы коснёмся таких вопросов, как использование утилит cron и at , поговорим о системе пакетного выполнения команд с использованием очереди (task spooler). Я, как и в большинстве случаев обсуждения возможностей Linux, не могу сказать, что то, о чём я хочу рассказать, хотя бы близко подходит к полному освещению способов запуска команд в Linux. Но я надеюсь, что мой рассказ даст вам некоторые идеи относительно управления выполнением последовательностей команд.
Запуск команд из командной оболочки
Самый простой, хотя, возможно, не самый красивый способ запуска набора команд заключается в использовании обычной командной оболочки. Для этого команды достаточно разделить точкой с запятой:
Этот приём работает в большинстве командных оболочек, которые более или менее похожи на bash. Он хорошо подходит для запуска простого набора команд. Команды просто выполняются последовательно. Но что если надо запустить нечто вроде такой конструкции:
Не запускайте эту последовательность команд в реальной системе!
Нам нужно стереть в папке foo все файлы (но не подпапки — для этого нужен ключ -r ). А что если не удастся выполнить команду cd ? Тогда будут стёрты все файлы в текущей папке. А это — очень плохая идея, которая, к тому же, нарушает правило наименьшего удивления.
Защититься от вышеописанной проблемы можно, воспользовавшись оператором && . Эта последовательность символов, как и в языке C, представляет собой оператор И . Практически все Linux-команды возвращают, успешно отработав, 0, что воспринимается как истинное значение, а все остальные значения, указывающие на ошибки, считаются ложными. Это позволяет программистам возвращать коды ошибок при возникновении в программах каких-то проблем. Вот более удачный вариант вышеописанного примера:
Если директория foo существует — команда cd вернёт 0, который будет воспринят как истинное значение. Это означает, что результат операции И может быть истинным. Поэтому работа продолжается и выполняется команда ls . А вот если команду cd выполнить не удастся — результат будет ложным. Если любое из входных значений функции, реализующей логику оператора И , является ложным, то остальные входные значения роли уже не играют. В результате если хотя бы одна из частей этой конструкции вернёт ложное значение — выполнение всей последовательности команд будет остановлено. Получается, что если директории /foo не существует — команда ls попросту не выполнится.
С использованием && можно строить и более длинные конструкции.
Более длинная конструкция, в которой используется && (тут тоже есть rm, поэтому будьте очень осторожны, пытаясь запустить нечто подобное в реальной системе)
В ситуациях, подобных вышеописанной, может найти применение ещё один оператор — || ( ИЛИ ). Он позволяет завершить работу после того, как хотя бы одна команда вернёт истинное значение, то есть — отработает успешно. Например:
Попробуйте, вместо alw , ввести своё имя пользователя, а потом испытайте эту конструкцию с именем пользователя, которого в вашей системе нет (уверен, у вас нет пользователя alw ). Если grep отработает успешно, то команда echo выполнена не будет.
Если нужно — операторы можно смешивать. Правда, если вам нужно выполнить несколько команд, выполнение которых занимает много времени, то, о чём мы только что говорили, нельзя назвать самым удачным способом запуска таких команд. В подобной ситуации стоит взглянуть на систему пакетного выполнения команд, основанную на очереди задач, речь о которой пойдёт ниже.
Планирование запуска команд в определённое время
Иногда нужно, чтобы последовательность команд запустилась бы спустя некоторое время от текущего момента, или чтобы команды были бы выполнены в заданное время. Классический инструмент, используемый для решения подобных задач — это утилита cron . Во многих дистрибутивах есть стандартные директории, позволяющие запускать команды, например, каждый час или каждую минуту. Но лучше всего планировать запуск команд путём редактирования файла crontab . Обычно сначала создают скрипт, а потом уже делают запись о нём в crontab . Правда, необходимость в создании скрипта для запуска нескольких команд возникает далеко не всегда.
Файл crontab редактируют, пользуясь одноимённой командой ( crontab -e ). Каждая строка этого файла, не являющаяся комментарием, описывает некую команду, которую нужно выполнить. Первая часть такого описания сообщает о том, когда именно нужно выполнить команду. Вторая часть содержит указание на саму команду. Например, вот запись, позволяющая запустить команду обновления duckdns:
В начале строки находится описание времени запуска команды — минуты, час, день месяца, день недели. Конструкция */5 указывает на то, что команду нужно запускать каждые 5 минут. Символы * являются универсальными местозаполнителями, представляющими любой час, день месяца и так далее. Есть множество особых конструкций, которыми можно пользоваться в подобных описаниях. Для того чтобы упростить их составление — можете попробовать этот crontab-редактор. Пример работы с ним показан ниже.
Работа с crontab-редактором
Правда, при использовании cron можно столкнуться с одной проблемой. Она заключается в том, что логика утилиты основана на предположении о том, что компьютер работает в режиме 24/7. Так, если запланировать запуск некоей задачи на ночь, а ночью компьютер будет выключен — задача выполнена не будет. Есть ещё одна утилита, anacron , которая создана в попытке исправить этот недостаток. Она, учитывая некоторые ограничения, похожа на cron , но она «навёрстывает упущенное» в том случае, если на момент запланированного запуска некоей задачи компьютер был выключен.
Иногда нужно выполнить некую команду в заданное время лишь один раз. Сделать это можно с помощью команды at :
В ответ на эту команду будет показано простое приглашение командной строки, с помощью которого можно вводить команды. В данном случае эти команды будут выполнены через 10 минут. Эта команда, конечно, поддерживает и указание абсолютных временных значений. Кроме того, программа вас поймёт, если вы вместо 4PM сообщите ей о «teatime» (серьёзно). Команда atq позволяет просмотреть список запланированных задач. А команда atrm позволяет отменять запуск запланированных команд. Это пригодится в том случае, если по какой-то причине в выполнении запланированной команды больше нет необходимости. Если воспользоваться пакетной формой команды ( batch ), система выполнит команды тогда, когда нагрузка на неё будет не слишком высокой.
Если почитать справку по at , то можно узнать о том, что утилита, по умолчанию, использует очередь a для обычных задач, а очередь b для пакетных задач. Для указания очередей можно использовать буквы из диапазонов a-z и A-Z. От имени очереди зависит приоритет помещённых в неё задач.
Тут мне хотелось бы отметить то, что в большинстве систем все задачи, поставленные в очередь, будут выполняться в оболочке, заданной как оболочка, используемая по умолчанию (вроде /bin/sh ), и это необязательно будет bash. Может понадобиться использовать именно bash, или протестировать команды в оболочке, используемой по умолчанию. Если просто запустить скрипт, в котором, в качестве интерпретатора указан bash (например — #!/usr/bin/bash ), то это будет незаметно.
Пакетное выполнение задач
Хотя утилита at имеет вариант, выглядящий как batch , её нельзя назвать полноценной системой, предназначенной для пакетного выполнения задач. Существует несколько подобных систем для Linux, обладающих различными особенностями. Одна из таких систем называется Task Spooler (в репозиториях Ubuntu — task-spooler ). В некоторых системах соответствующая команда выглядит как ts , но в Debian использование подобного имени команды приводит к конфликту, поэтому там используется команда tsp .
Команду tsp применяют, указывая при её вызове описание той задачи, которую нужно выполнить. Она возвращает номер задачи, который можно использовать при планировании зависимостей между задачами. Всё это похоже на использование утилиты at , но эта система отличается гораздо более мощными возможностями. Взгляните на это:
Первая команда запускает, в виде задачи, утилиту wget (это, на самом деле, задача 0). Выполнение команды tsp позволяет просмотреть список задач, находящихся в очереди (в данном случае это — всего одна задача, которая уже завершена). Опция -i позволяет просмотреть сведения об указанных задачах. Опция -c выводит выходные данные задачи. Опцию -c можно воспринимать как нечто вроде команды cat . Ещё одна опция, -t , похожа на опцию -f команды tail . Выходные данные задачи можно, кроме того, отправить по электронной почте, воспользовавшись опцией -m .
Обычно система пакетного выполнения задач выполняет одновременно лишь одну задачу. Это можно изменить, воспользовавшись опцией -S . Можно сделать так, чтобы некая задача ожидала бы, перед запуском, окончания работы предыдущей задачи. Это делается с помощью опции -d . Запуск задачи можно связать и с окончанием произвольно выбранной задачи — для этого используется опция -w .
Если вы читали справку по tsp , то вы могли обратить внимание на то, что эта команда поддерживает и множество других опций. Перед тем, как воспользоваться этой командой в некоей системе, стоит помнить о том, что она может выглядеть не как tsp , а как ts . Примеры использования этой утилиты можно найти на её сайте.
Итоги
Как и во многих других ситуациях, возникающих при работе в Linux, вышеописанные способы запуска наборов команд можно комбинировать. Например, можно сделать так, чтобы cron поставил бы задачу в очередь. А сама эта задача может представлять собой скрипт, в котором применяются операторы && и || , управляющие внутренней логикой выполнения набора команд. Думаете, что это неоправданно сложно? Может быть. Как я уже говорил, можно просто взять и написать обычный скрипт. Но в Linux есть и много других полезных механизмов для решения самых разных задач.
Как вы обычно запускаете наборы команд в Linux?
Источник