Приятно познакомиться, любопытный ум! ✌️ В этой статье я хотел рассказать, как вы можете планировать задачи в Linux.
По большей части есть 2 подхода: таймеры cron и systemd. Хотя я собираюсь потратить все время на первое, последнее также является вариантом, который вы можете изучить самостоятельно.🕺
Также я покажу концепцию, которую мы использовали для реализации cron в Picklang для запуска push-уведомлений для пользователей.
‼️Прежде чем погрузиться‼️, я хотел сделать дискалимер, что я не первоклассный системный администратор, а инженер-программист, который имеет опыт работы с Linux и различные вещи с ним, которые работали. Знания в этой статье собраны из моего собственного опыта/книг/статей/коллег
Кстати, если вы хотите выучить иностранный язык с помощью ИИ, посетите https://picklang.ml, чтобы узнать больше.
Не забавный факт😩: я провел примерно месяц, балуясь cron и его взаимодействием с Docker. Если бы я прочитал книгу Дэвида Клинтона Linux в действии раньше, я бы сэкономил десятки часов
Структура статьи:
- Обзор крона
- Типы крона
- Очень важное замечание
- Пример запуска cron + Gunicorn в одном Dockerfile
- Заключительные слова
Обзор крона
Что вообще такое cron? Это встроенный планировщик Linux, который вы можете использовать, если вам нужно периодически выполнять некоторые операции.➰
Где живет крон? Как вы, возможно, знаете, вся Linux-система происходит от могущественного корня: /. Итак, давайте посмотрим на обзор файловой системы Linux:
/ - root - /etc - here everything cron related lives - /var - /home - /sbin - /bin - /lib - /usr
В каталоге есть различные каталоги и файлы.
Запустите ls /etc | grep cron
, который будет выплевывать различные типы и ароматы
Типы крона
Папки
Есть такие папки, как cron.daily
, cron.hourly
, cron.monthly
, cron.weekly
и, наконец, cron.d
. Вам нужно поместить файл cron внутрь, и Linux выполнит их.
Но есть пара ограничений для {.daily, .hourly, .monthly, .weekly}
:
- Файлы должны быть без расширений
- Вам нужно поставить
#! /bin/bash
в начало файла - Файлы должны быть исполняемыми:
chmod +x file
Стоп, как Linux будет выполнять файлы самостоятельно?🧐
Давайте еще раз посмотрим на расширение папок: размещение в файлах с daily
, hourly
и т. д. приведет к тому, что файлы будут выполняться в соответствии со временем.
Вот, надеюсь, вы уловили суть. А как же cron.d
? А, вот вы кладете свой файл и указываете точное время. Как?
Сначала посетите великолепный сайт с именем Crontab guru: https://www.manning.com/books/linux-in-action
Уловил намек? Вы указываете, как часто вы хотите запускать задачу.
Например, вы можете вставить cron.d
:
*/5 * * * * root apt update && apt upgrade
Который будет запускать его каждые пять минут.
Важно: не добавляйте никаких расширений. Просто
touch some_file
и ничего больше
И, очевидно, если положить в папки с daily
и т.д. --› не нужны эти *
Файлы
И еще 2 файла: crontab
и anacron
crontab
напоминает папкуcron.d
- Играйте только с
crontab
в папке/etc
, так как этоcrontab
для текущего пользователя. - Если вы хотите использовать его для выполнения своих задач, вы можете сделать это, как мы сделали при запуске. Вы указываете в файле
crontab
периоды, как в обычном cron, а затем какие файлы должны быть выполнены:
01 * * * * root run-parts /etc/cron.hourly
2. anacrontab
- это немного другой тип зверя. Напишу об этом ниже.
Что делать, если вы не уверены, будет ли ваш сервер/компьютер работать в указанное время в файле cron? Плохо…😮💨 Но не неуправляемо. На помощь приходит anacrontab. Это позволяет запускать что-то после определенного времени загрузки.
😶🌫️Отступление: вы можете указать определенную логику внутри файлов crontab
и anacrontab
для каталогов, описанных выше:
*/1 * * * * root run-parts /etc/cron.hourly
Итак, файлы внутри cron.hourly
будут запускаться
Затем вы можете перечислить все существующие croncrontab -l
и отредактировать ихcrontab -e
😶🌫️
Возвращаясь к anacrontab
: здесь 2 цифры вместо 5. Поскольку мы говорим о времени после загрузки, нужно указать:
- интервал в днях:
0 || 7
— воскресенье, понедельник —1
- интервал после загрузки: в минутах
1 10 someJob /home/user_name/some_script.sh
: он будет запускаться каждый понедельник через десять минут после загрузки. someJob
— это идентификатор задания, который должен быть уникальным для каждого cron.
Вы можете сыграть адвоката дьявола и сказать: «А что, если мы поместим две одинаковые строки в anacrontab и crontab?» Я сразу дам вам ответ: «Anacrontab имеет преимущество над обычным crontab».
Очень важное замечание
Если вы хотите запустить что-то со временем: введите cron.d
. Если вы хотите иметь .daily
, .weekly
и так далее: поместите их в соответствующие папки.
Затем, если вы хотите, чтобы файл запускался после загрузки через определенные промежутки времени: anacrontab
. Вы можете указать файлы/скрипты в других каталогах.
Кроме того, прочитайте следующий пост о «serverfault» о cron.d
и о том, как Linux узнает о файлах без использования crontab
:
И еще один на «unix.stackexchange» о разнице между crontab
и cron.d
:
Пример Picklang запуска cron с Dockerfile
При запуске мы решили объединить команду управления Django и cron для отправки push-уведомлений нашим пользователям. Как это было сделано?🤔
PS: Я не могу раскрывать реальный код или фрагменты, поэтому здесь я буду использовать отдельные примеры
.py
внутриmanagement/commands
, который теперь считается жизнеспособной командой управления. В файле у нас есть логика для выбора пользователей на основе критериев. Затем мы используем APNS для отправки push.- Создайте файл обычный текст, в который я поместил логику для cron:
- Здесь
*
нужно запускать cron каждые 45 минут. - Затем введите
app
каталог. Почему? -› В Dockerfile по умолчанию все используютapp
- Далее устанавливаем кредитное плечо в Dockerfile python3
python3 manage.py send_push
должен вызвать команду управления Django.- Этот нечетный
> /proc
… для стандартного вывода или stdout
3. Пример Dockerfile:
- скопируйте обычный текстовый файл в
cron.d
: строка 3 - Укажите разрешения и зарегистрируйте наш cron с помощью crontab.
- Запустите cron в фоновом режиме с &
- Используйте &&, чтобы склеить его с помощью gunicorn для запуска приложения.
Заключительные слова🙌
Надеюсь, вы получили что-то полезное для своей работы и сайд-проектов⚡️
Кроме того, вы можете исследовать так называемый systemd timer
, который является аналогом cron, но дает больше гибкости.🤸♂️
Вы можете найти меня🔎:
- LinkedIn: www.linkedin.com/in/sleeplesschallenger
- GitHub: https://github.com/SleeplessChallenger
- Литкод: https://leetcode.com/SleeplessChallenger/
- Телеграмма: @SleeplessChallenger