Приятно познакомиться, любопытный ум! ✌️ В этой статье я хотел рассказать, как вы можете планировать задачи в 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}:

  1. Файлы должны быть без расширений
  2. Вам нужно поставить #! /bin/bash в начало файла
  3. Файлы должны быть исполняемыми: 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

  1. 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: Я не могу раскрывать реальный код или фрагменты, поэтому здесь я буду использовать отдельные примеры

  1. .py внутри management/commands, который теперь считается жизнеспособной командой управления. В файле у нас есть логика для выбора пользователей на основе критериев. Затем мы используем APNS для отправки push.
  2. Создайте файл обычный текст, в который я поместил логику для cron:
  • Здесь * нужно запускать cron каждые 45 минут.
  • Затем введите app каталог. Почему? -› В Dockerfile по умолчанию все используют app
  • Далее устанавливаем кредитное плечо в Dockerfile python3
  • python3 manage.py send_push должен вызвать команду управления Django.
  • Этот нечетный > /proc … для стандартного вывода или stdout

3. Пример Dockerfile:

  1. скопируйте обычный текстовый файл в cron.d : строка 3
  2. Укажите разрешения и зарегистрируйте наш cron с помощью crontab.
  3. Запустите cron в фоновом режиме с &
  4. Используйте &&, чтобы склеить его с помощью gunicorn для запуска приложения.

Заключительные слова🙌

Надеюсь, вы получили что-то полезное для своей работы и сайд-проектов⚡️

Кроме того, вы можете исследовать так называемый systemd timer, который является аналогом cron, но дает больше гибкости.🤸‍♂️

Вы можете найти меня🔎: