Примеры заданий для Crontab
Давайте проверим некоторые примеры crontab для планирования заданий cron.
1. Запускать задания cron каждые 12 часов
Это помогает при регулярных проверках системы или резервном копировании. Чтобы запланировать выполнение задачи каждые 12 часов, введите:
2. Запускать задание cron каждые 5 минут
Иногда вам нужно следить за своей системой каждые n минут. Используйте следующее выражение для выполнения задачи каждые 5 минут.
3. Запускать работу cron каждый день в 2 часа ночи
Ежедневное резервное копирование может быть запланировано на определенное время. Следующее выражение запускает задание cron каждый день в 2 часа ночи.
Чтобы запланировать работу cron каждый день в 2 часа дня, cron использует 24-часовые часы.
7. Пример задания cron для запуска каждую субботу в 1 час ночи
Это поможет вам запустить резервное копирование в субботу в определенное время. Следующее выражение помогает выполнять работу cron каждую субботу в 1 час ночи.
13. Запуск задания cron ежемесячно
Вместо использования 0 0 1 * *, вы можете использовать ярлык с помощью @monthly. Он работает в 00:00 1-го числа месяца. В качестве альтернативы вы можете разместить свой скрипт в /etc/cron.monthly/.
14. Запуск задания cron еженедельно
Вместо использования 0 0 * * mon, вы можете использовать ярлык с помощью @weekly. Он начинается в 00:00 в понедельник. В качестве альтернативы вы можете разместить свой скрипт в файле /etc/cron.weekly/.
15. Запуск задания cron ежедневно
Вместо использования 0 0 * * *, вы можете использовать ярлык с помощью @daily. Это работает каждый день в 00:00. В качестве альтернативы вы можете разместить свой сценарий в файле /etc/cron.daily/.
16. Выполнение задания cron каждый час
Вместо использования 0 */1 * * *, вы можете использовать ярлык с помощью @hourly. Он работает в 0 минут каждый час. В качестве альтернативы вы можете разместить свой скрипт в файле /etc/cron.hourly/.
17. Запуск задания cron при перезагрузке
Для запуска задачи при каждой перезагрузке системы используйте строку @reboot. Скрипт будет выполнен после перезагрузки.
18. Запуск задания для cron каждые 30 секунд
Cron позволяет работать только с минутами. Не существует простого способа запланировать выполнение задания каждые 30 секунд.
Но мы можем использовать обходной путь, увеличив задержку на 30 секунд.
19. Запустите задание cron и перенаправить вывод
Если наш скрипт имеет какой-то вывод, нам, возможно, захочется его увидеть. Для этого можно сохранить его в отдельный файл. Этот пример позволит запускать php-скрипт каждые 3 минуты и перенаправлять вывод в файл.
Обратите внимание что тут используются абсолютные пути, так как мы не определили нашу переменную $PATH
Резервное копирование заданий cron
Для бекапа задач cron, можно использовать следующую команду:
Для бекапа задач cron определенного пользователя:
Чтобы восстановить cron из файла резервной копии, просто используйте:
3. Способы удаления проверки запуска программы от root’а
Кроме универсального способа – запуск программы от обычного пользователя, либо переход на использование учётной записи обычного пользователя, у каждой программы есть свои варианты обхода. Например, загрузчиком Tor Browser является скрипт (обычный текстовый файл), в котором проводится проверка, запущена ли программа с правами рута. Поэтому достаточно в этом файле (/opt/Browser/start-tor-browser) строку «id -u» заменить, например, на «echo 1» и Tor Browser будет запускаться от рута.
Для Chromium и Google Chrome имеется ключ —no-sandbox, который позволяет открывать эти программы в Kali Linux без дополнительных манипуляций:
chromium --no-sandbox google-chrome --no-sandbox
Запуск программы VLC осуществляется бинарным файлом, который можно пропатчить следующей командой:
sed -i 's/geteuid/getppid/' /usr/bin/vlc
Также VLC можно скомпилировать самому с флагом —enable-run-as-root.
Настройте доступ crontab для вашей учетной записи пользователя
Crontab зависит от пользователя. Вы уже затронули это немного. Если вы думаете, что вы уже использовали crontab, вы можете проверить это с помощью crontab -l .
andreyex@destroyer:~$ crontab -l no crontab for andreyex andreyex@destroyer:~$ crontab -e no crontab for andreyex - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/code 3. /bin/ed Choose 1-3 : 1
Когда мы запускаем эту команду, вы видите, что у нас нет crontab в этой системе.
Поскольку мы еще не создали crontab, когда используем -e для редактирования таблицы, он запрашивает наш предпочтительный текстовый редактор. Nano предлагается в качестве самой простой в использовании программы. Вы можете использовать любой текстовый редактор командной строки, например Vim или Emacs. Это действительно зависит от вас.
Если сначала не получится, sudo
Если вы попытаетесь выполнить команду crontab -e, но не получите этот результат, у вас могут не быть привилегий пользователя для создания таблицы. Если у вас есть доступ к sudo, вы можете использовать sudo для установки crontab.
sudo crontab -e <your_username>
Ваша система автоматически загрузит ваш crontab в нужное место, которое может варьироваться в зависимости от дистрибутива, но часто находится в каталоге, таком как /var/spool/cron/crontabs. Не пытайтесь редактировать файлы здесь.
Cron не запускается по умолчанию
В Windows 10 и Windows 11 cron входит в состав сред Linux, таких как Ubuntu. Проблема в том, что WSL не запускает cron автоматически, а это означает, что ваши автоматические задачи не выполняются по умолчанию.
Чтобы исправить это, вы можете запускать cron вручную каждый раз, когда открываете командную строку, но ручной запуск инструмента, который должен автоматизировать задачи, вроде как упускает суть.
К счастью, есть простой способ исправить это, и он требует использования планировщика заданий.
Если вы никогда не использовали cron в Linux для выполнения задач, ознакомьтесь с нашим предыдущим руководством о том, как планировать задачи в Linux. Для наших целей здесь мы предполагаем, что вы уже создали несколько заданий cron в своей установке WSL и вам нужна помощь, чтобы они работали, а не постоянно присматривали за cron.
В этом руководстве мы собираемся использовать службу sudo для проверки и запуска cron, что является рекомендуемым способом остановки и запуска служб в современных сборках Ubuntu — самого популярного дистрибутива для WSL.
Также обратите внимание, что в этом руководстве предполагается, что у вас есть права администратора в вашей версии WSL. Если вы единственный пользователь своего ПК и включили WSL самостоятельно, у вас есть права администратора
Совет: это работает и в подсистеме Windows для Linux в Windows 11, а не только в Windows 10.
Специальные символы
В cron-выражениях используются следующие специальные символы:
* — все значения в пределах одного фрагмента cron-выражения. Например, в поле «Minutes» специальный символ «*» обозначает, что задача будет выполняться каждую минуту;
? — неопределенное значение
Если Вам необходимо, чтобы задача запускалась, к примеру 10 числа каждого месяца, но не важно, в какой день недели, то в поле «Day of month» необходимо установить значение «10», а в поле «Day of week» — «?»;
— — определение диапазонов. Например, «10-12» в поле «Hours» означает часы 10, 11 и 12;
, — указание дополнительных значений
К примеру, значения «ПОНЕДЕЛЬНИК, СРЕДА, ПЯТНИЦА» в поле «Day of week» будут использоваться в cron-выражении в виде запуска задачи в понедельник, среду и пятницу;
— приращение значений. Например, «5/15» в области секунд означает «секунды 5, 20, 35, и 50, то есть значение «5» будет увеличиваться на «15»;
L — определение последнего дня. В поле «Day of month», к примеру, значение «L» подразумевает, что задача будет выполняться в последний день каждого месяца. В поле «Month» значение «6L» обозначает, что задача была запущена в прошлую пятницу месяца;
W — определение буднего дня (понедельник-пятница). Например, в поле «Day of month» значение «15 W» будет обозначать самый близкий будний день к 15-ому из месяца, то есть если 15-м числом является суббота, задача будет запущена в пятницу 14-го. Если 15-ым числом будет воскресенье, то задача будет запущена в понедельник 16-го.
Синтаксис crontab
# crontab -e SHELL=binbash MAILTO=mymail@someprovider.com PATH=bin:sbin:usrbin:usrsbin:usrlocalbin:usrlocalsbin # Детали смотрите в следующих разделах # Примеры оформления задач в планировщике (формат данных): # .---------------- минуты (0 - 59) # | .------------- часы (0 - 23) # | | .---------- дни месяца (1 - 31) # | | | .------- сами месяцы (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- дни недели (0 - 6) (0 или 7 это воскресенье в зависимости от настроек системы) можно использовать сокращения типа mon,tue,wed,thu,fri,sat,sun # | | | | | # * * * * * имя пользоваться команда, которую нужно запустить # создание копии всей операционной системы с помощью кастомного скрипта 01 01 ***usrlocalbin/bckp-vbd1 ; usrlocalbin/bckp-vbd2 # установка соответствия между временем операционной системы и "железа" 03 05 ***sbinhwclock --systohc # проведение обновления операционной системы в заданный период времени 25 04 1 * * /usr/bin/apt-get update
Первые три линии кода в таблице отвечают за первичную настройку. Сначала указывается оболочка, в которой будет работать Cron. У утилиты нет каких-либо предпочтений, поэтому можно указать любую на собственное усмотрение (в нашем примере это bash). Затем указывается адрес электронный почты, на который будут отправляться отчеты о работе планировщика. И напоследок указывается путь к окружению.
В нашем случае указаны команды:
02 04 5 * * /usr/local/bin/bckp -vbd1 ; /usr/local/bin/bckp -vbd2 04 06 * * * /sbin/hwclock –systohc 10 05 5 * * /usr/bin/apt-get update 05 * * * * rm /home/myusername/tmp/*
Примеры использования Cron в командной строке
Команда
02 04 5 * * /usr/local/bin/bckp -vbd1 ; /usr/local/bin/bckp -vbd2
создает в таблице расписания задачу на запуск скрипта под названием bckp (представим, что такой существует), который создает резервную копию всей системы на стороннем накопителе. Он выполняется 5 числа каждого месяца в 4 часа 2 минуты утра. Это видно по числовым значениям. Звездочки же указывают на отсутствие конкретного значения. Cron воспринимает их как «выполнять каждый раз», то есть каждый месяц, день или неделю.
Команда
04 06 * * * /sbin/hwclock –systohc
меняет время аппаратного обеспечения на то, что используется в системе. Делает это каждый день, каждую неделю и каждый месяц в 6 часов 4 минуты утра. Как видите, здесь пропущено третье значение. Поэтому команда и запускается ежедневно, так как нет более конкретных правил.
Команда
10 05 5 * * /usr/bin/apt-get update
запускает обновление пакетов с помощью пакетного менеджера apt каждый месяц 5 числа в 05:10.
Команда
05 * * * * rm /home/myusername/tmp/*
удаляет содержимое папки с временными файлами для конкретного пользователя (меня) на пятой минуте (первый пункт) каждого часа. Так как определенные значения отсутствуют для всех остальных пунктов, получается, что скрипт готов выполняться каждый день, каждый месяц и каждый час. Но первое значение указано, поэтому он будет дожидаться пятой минуты и запускаться в этот момент. То есть в 12:05, 13:05, 14:05 и т.п.
Как видите, разобраться с базовыми командами несложно.
Синтаксис Crontab
Каждая строка в файле crontab представляет задание. Это задание содержит пять полей, за которыми следует команда или скрипт для выполнения.
Синтаксис:
* | Минуты | Это значение может быть в пределах 0 — 59 |
* | Часы | Это значение может быть в пределах 0 — 23 |
* | День месяца | Это значение может быть в пределах 1 — 31 |
* | Месяц в году | Это значение поля находится в диапазоне от 1 до 12. Так же можно использовать три первые буквы названия месяца, например: jan, feb, mar |
* | День недели | Это значение поля находится в диапазоне от 0 до 7. Где 0 и 7-воскресенье. 1-понедельник, 2-вторник и так далее |
Указать несколько значений или диапазон
Для определения нескольких значений или диапазона используйте запятую (,) и дефис (-). Звездочка (*) соответствует чему угодно. Например, для отображения нескольких значений используйте 1,2,3, а для диапазона можно использовать 1-3.
пример:
0 10 1-3 * * /scripts/test.sh
Перечисление заданий cron системы
/etc/crontab и файлы внутри каталога /etc/cron.d являются общесистемными файлами crontab, которые могут редактировать только системные администраторы.
Используйте cat, less или любой текстовый редактор, чтобы просмотреть содержимое файлов:
cat /etc/crontab /etc/cron.d/*
В большинстве дистрибутивов Linux вы также можете поместить скрипты в каталоги /etc/cron.{hourly,daily,weekly,monthly}, и скрипты выполняются каждый час/день/неделя/месяц.
Каждый скрипт внутри этих каталогов должен иметь разрешение на выполнение. В противном случае задание cron не будет выполнено.
Например, чтобы просмотреть все еженедельные задания cron, введите:
ls -l /etc/cron.weekly/
-rwxr-xr-x 1 root root 813 Feb 10 2019 man-db
Если вывод пуст, это означает, что еженедельных заданий cron нет.
Ограничение доступа
Вы можете управлять тем, каким пользователям разрешается использовать команду , с помощью файлов и , которые хранятся в директории . Если файл существует, любой пользователь, который будет указан в нем, не будет иметь возможность менять файл crontab. Если существует, то только пользователи, указанные в нем, будут иметь возможность изменять файлы crontab. Если оба файла существуют, и пользователь указан в каждом файле, файл будет иметь приоритет над , и этот пользователь сможет изменять файл crontab.
Например, чтобы запретить доступ для всех пользователей, а затем предоставить доступ пользователю ishmael, вы можете использовать следующую последовательность команд:
Сначала мы закрываем доступ для всех пользователей, добавив в файл . Затем, добавив имя пользователя в файл , мы предоставим пользователю ishmael доступ к выполнению задач cron.
Обратите внимание, что если пользователь имеет права , он может изменять файл crontab другого пользователя с помощью следующей команды:
Однако, если существует, и user добавлен в него, но не указан в файле , вы получите следующую ошибку после запуска предыдущей команды:
По умолчанию большинство демонов cron полагает, что все пользователи имеют доступ к cron, если только не существует или .
Почему мой Crontab не работает?
Определенные причины могут привести к сбою вашего Crontab. Первая и самая главная проблема заключается в том, что ваш демон Cron может не работать по какой-либо причине, что, следовательно, приведет к сбою вашего Crontab. Возможно, переменные среды вашей системы настроены неправильно. В скрипте, который вы пытаетесь выполнить с помощью Crontab, могут быть ошибки. Например, в желаемом сценарии может отсутствовать Shebang, т. е. необходимая последовательность символов в начале сценария. Сценарий, который вы пытаетесь выполнить с помощью Crontab, может быть не исполняемым, т. е. его права доступа ограничены. Возможно, путь к сценарию, который вы пытаетесь выполнить, неверен. Возможно, вам не хватает расширения файла, который вы пытаетесь запустить с помощью Crontab.
Системные таймеры
Системные таймеры – это файлы модулей, которые заканчиваются суффиксом *.timer и позволяют запускать сервисные модули в зависимости от времени.
В дистрибутивах, использующих systemd в качестве системы инициализации, таймеры используются в качестве альтернативы стандартному демону cron.
Чтобы просмотреть список всех системных таймеров на вашем компьютере, выполните следующую команду:
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES Sun 2020-02-19 01:00:00 UTC 1h 53min left Sat 2020-02-15 17:04:11 UTC 5h 2min ago logrotate.timer logrotate.service Sun 2020-02-19 01:00:00 UTC 1h 53min left Sat 2020-02-15 17:04:11 UTC 5h 2min ago man-db.timer man-db.service Sun 2020-02-19 02:50:52 UTC 5h 44min left Sat 2020-02-15 17:04:11 UTC 5h 2min ago apt-daily.timer apt-daily.service Sun 2020-02-19 04:12:38 UTC 8h left Sat 2020-02-15 17:04:11 UTC 5h 2min ago apt-daily-upgrade.timer apt-daily-upgrade.service Sun 2020-02-19 05:44:56 UTC 20h left Sat 2020-02-15 17:16:10 UTC 4h 50min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Запуск Python-скрипта с помощью Сron
Давай потестируем то, что у нас получилось на маленьком скрипте, который будет писать в файл дату и время его активации. Таким образом мы проверим как работает cron. Тестовый скрипт, который мы положим в корень папки проекта, у меня это /home/iakulshin/pipeline, заливаем через файловый менеджер filezilla и прочие, если вы хардкорный девопс-дата-инженер удачи вам с nano. Заливаем скрипт указанный ниже в нашу папку.
from datetime import datetime with open('test.txt', 'a+', encoding='utf-8') as file: file.write(datetime.today().strftime('%Y-%m-%d-%H-%M-%S') + '\n')
Давайте попробуем создать cron задание для тестового запуска. В целом нам будут нужны 2 команды:
crontab -l # выводит список текущих заданий crontab -e # открывает файл заданий crontab -r # удаляет файл задания Пишем в консоль crontab -e
Появлеятся файлик с крон задачами в редакторе nano. Наша задача установить задание, которое будет запускать наш скрипт каждую минуту.
* * * * * cd /home/iakulshin/pipeline && /home/iakulshin/pipeline/venv/bin/python3 test.py
Как проверить, выполняются ли задания Cron
Предполагается, что Cron работает тихо в фоновом режиме и позволяет вам работать без помех, пока он выполняет ваши задачи. Но как вы можете убедиться, что это на самом деле работает?
Cron имеет встроенную функцию уведомлений по электронной почте, но для этого требуется настроить хотя бы простой локальный почтовый сервер. почтовый сервер Не многие домашние пользователи желают настроить это, и не многие дистрибутивы предоставляют его по умолчанию (например, Ubuntu этого не делает). Самый быстрый способ проверить cron — это просмотреть системный журнал с помощью этой команды:
Опция -i делает наш запрос нечувствительным к регистру. Возможно, что у cron будет свой собственный файл журнала где-нибудь в , поэтому посмотрите, не сможет ли эта команда дать полезные результаты.
Если вам нужно сохранить вывод определенного задания cron, вы можете перенаправить его в файл. Укажите путь и имя файла в последнем столбце вашего crontab после команды, которую вы хотите выполнить:
Использование одного символа> перезапишет файл при каждом запуске команды. Чтобы избежать этого, используйте >> вместо этого — он добавляет вывод в существующий файл.