Що таке cron і як налаштувати розклад завдань?

Автор: Опубліковано

Коротко: Cron — це механізм систем Unix і Linux, який автоматично запускає команди або скрипти за заданим розкладом. З його допомогою можна створювати резервні копії, формувати звіти чи видаляти старі файли, наприклад щодня о 2:30. Щоб завдання працювало правильно, потрібно вказати не лише час запуску, а й команду, права доступу та спосіб перевірки помилок.

Як працює cron і для чого він потрібен?

Cron працює у фоновому режимі як системна служба: перевіряє розклад і запускає вказані в ньому команди. Окрема команда із заданим часом виконання називається завданням cron, а crontab — це таблиця, у якій зберігаються розклади завдань.

Типові застосування — нічний експорт бази даних, отримання даних із зовнішньої системи, перерахунок зведень і очищення тимчасових файлів. Cron відповідає за запуск операції, але не за її логіку. Якщо скрипт резервного копіювання містить помилку, розклад сам її не виправить і не підтвердить, що дані з копії можна відновити.

Завдання виконується з правами користувача, якому належить запис. Зазвичай запускати його від імені системного адміністратора не потрібно. Обліковий запис повинен мати доступ лише до файлів і ресурсів, потрібних для цієї операції.

Як читати запис розкладу?

У типовому crontab користувача запис складається з п’яти полів часу та команди. Зліва направо поля означають: хвилину, годину, день місяця, місяць і день тижня.

30 2 * * * /usr/bin/python3 /home/ivan/skrypty/zvit.py

Цей запис запускає скрипт щодня о 2:30. Зірочка означає будь-яке допустиме значення поля, тому три зірочки відповідають будь-якому дню місяця, місяцю та дню тижня.

РозкладЗначення
*/15 * * * *Кожні чверть години: на хвилинах 0, 15, 30 і 45
0 8 * * 1-5З понеділка до п’ятниці о 8:00
0 3 1 * *Першого дня кожного місяця о 3:00

Скісна риска задає крок у відповідному полі, дефіс — діапазон, а кома розділяє значення, наприклад 0,30 у полі хвилин. Запис */15 не означає «через 15 хвилин після завершення попереднього завдання» — розклад прив’язаний до годинника.

Будьте уважні, коли одночасно обмежуєте день місяця й день тижня. У поширених реалізаціях cron тоді достатньо виконання однієї з цих двох умов, а не обох. Перш ніж використовувати такий запис, перевірте документацію версії, доступної на сервері.

Системні файли, як-от /etc/crontab, мають додаткове поле користувача перед командою. Не копіюйте їхні записи без змін до особистого crontab.

Як налаштувати перше завдання cron?

На сервері зі встановленим cron і доступом до термінала можна скористатися наведеною нижче процедурою. Шляхи в прикладах наведені для ілюстрації — замініть їх на фактичні шляхи у своєму обліковому записі.

  1. Перевірте команду вручну. Запустіть /usr/bin/python3 /home/ivan/skrypty/zvit.py від імені того самого користувача, який виконуватиме завдання.

  2. Відкрийте розклад командою crontab -e.

  3. Додайте запис зі збереженням результату у файл:

    30 2 * * * /usr/bin/python3 /home/ivan/skrypty/zvit.py >> /home/ivan/zhurnaly/zvit.log 2>&1
    
  4. Збережіть зміни й перевірте записи командою crontab -l.

  5. Після запланованого часу перевірте результат, наприклад створений звіт, а також вміст файлу журналу.

Оператор >> дописує повідомлення у файл, а 2>&1 спрямовує до нього також повідомлення про помилки. Каталог zhurnaly має вже існувати, а користувач, який виконує завдання, повинен мати право запису в нього. Журнал може зростати без кінця, тому за постійного використання потрібне обмеження його розміру або ротація — періодичне архівування та видалення старих записів.

На спільному хостингу розклад часто налаштовують у панелі керування, а не в терміналі. Перевірте в документації провайдера мінімальний інтервал між запусками, доступні інтерпретатори та обмеження часу виконання.

Чому завдання не працює, хоча команда працює вручну?

Cron запускає команди в обмеженішому середовищі, ніж інтерактивний термінал. Йому можуть бути недоступні ті самі змінні середовища, шляхи до програм або налаштування оболонки. Тому використовуйте повні шляхи й не припускайте, що робочим каталогом буде каталог скрипту.

Якщо програму потрібно запускати з певного каталогу, запис може мати такий вигляд:

0 6 * * * cd /home/ivan/zastosunok && /usr/bin/python3 zvit.py

Якщо завдання не дає результату, послідовно перевірте: роботу служби cron, обліковий запис, від імені якого виконується завдання, права доступу, шляхи, потрібні змінні, а також системні журнали та журнали застосунку. Сама відсутність повідомлення про помилку не доводить успішного виконання — скрипт має повідомляти про невдачу й давати змогу перевірити результат.

Час виконання також залежить від налаштування часового поясу. Перевірте його на сервері або в панелі хостингу, особливо якщо очікуєте запуску за польським часом. Під час переведення годинника поведінка завдань, запланованих на пропущену або повторену годину, залежить від реалізації.

Які обмеження має cron?

Класичний cron зазвичай не виконує згодом запуски, пропущені через вимкнення сервера. Він також не запобігає автоматично одночасному виконанню кількох екземплярів завдання: якщо скрипт працює 20 хвилин, а запускається кожні 10 хвилин, дві його копії можуть працювати одночасно. Для операцій зі спільними даними застосуйте блокування, наприклад механізм flock, доступний у багатьох системах Linux.

Для завдань, які потрібно виконувати після пропущених запусків, можна розглянути anacron або належно налаштовані таймери systemd. Якщо потрібне виконання операцій у черзі та повторення невдалих спроб, кращим рішенням може бути черга завдань.

Також не плутайте системний cron із WP-Cron у WordPress. За замовчуванням WP-Cron перевіряє заплановані завдання під час запитів до сайту, тому за малої відвідуваності їх виконання може затримуватися.

Для першої автоматизації виберіть некритичне завдання із записом результатів у журнал. Лише після підтвердження фактичного результату доручайте їй видалення даних або створення резервних копій.

Дивіться також: Що таке 2FA?

Читайте також

Дізнайтеся, як PHP-FPM обробляє запити PHP, чим відрізняється від вебсервера та як налаштувати процеси під трафік і ресурси хостингу.
Дізнайтеся, як BIND обслуговує DNS, чим відрізняються його серверні ролі та коли варто розгортати його самостійно замість керованої послуги.
Дізнайтеся, що означають польський реєстр і номер REGON, чим вони відрізняються від NIP та KRS і як перевірити дані підприємства.