Cron & crontab, пояснено

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

Що таке cron?

Назва cron походить від грецького chronos, що означає "час". В операційній системі Unix cron - це звичайний диспетчер фонових процесів (демон), який запускає процеси або сценарії через рівні проміжки часу (наприклад, кожну хвилину, день, тиждень або місяць). Процеси, які необхідно виконати, і час, коли вони повинні бути виконані, вказуються у файлі crontab.

Como роботи

Демон cron починається з /etc/rc.d/ o /etc/init.d залежно від розподілу. Cron працює у фоновому режимі, перевіряє таблицю завдань crontab щохвилини / etc / crontab про ан / var / spool / cron у пошуку завдань, які потрібно виконати. Як користувач ми можемо додавати команди або сценарії із завданнями до cron для автоматизації деяких процесів. Це корисно, наприклад, для автоматизації оновлення системи або хорошої системи резервного копіювання.

Пов'язана стаття:
Підручник: Встановіть пакети .tar.gz та .tar.bz2

Що таке Кронтаб?

Crontab - це простий текстовий файл, в якому зберігається список команд, що виконуються у визначений користувачем час. Crontab перевірить дату та час, коли слід виконати сценарій або команду, дозволи на виконання, і зробить це у фоновому режимі. Кожен користувач може мати власний файл crontab, власне файл / etc / crontab вважається, що це файл crontab кореневого користувача, коли звичайні користувачі (і навіть root) хочуть створити власний файл crontab, тоді ми будемо використовувати команду crontab.

Crontab - це найпростіший спосіб управління завданнями cron у багатокористувацьких системах, як звичайний користувач системи, так і користувач root.

Використання crontab

Ми починаємо з простого прикладу.

Ми збираємося автоматизувати оновлення системи, щоб усунути докучливе «Мені завжди доводиться оновлювати, і мені це не подобається!

як
Пов'язана стаття:
Команди на знання системи (визначити апаратні та деякі конфігурації програмного забезпечення)

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

#! / bin / bash # приклад оновлення сценарію # вибрати ваш дистрибутив # debian-ubuntu # apt-get update & apt-get -y upgrade #fedora #yum -y update #Arch #pacman --noconfirm -Syu

Видаліть # із вашої дистрибутивної лінії. Якщо це Ubuntu / Debian, це починається з apt-get.

Ми зберігаємо скрипт як update.sh (наприклад, каталог скриптів у вашому домі). Ми змінюємо дозволи на виконання згаданого сценарію за допомогою:

chmod a + x ~ / scripts / update.sh

Ми запускаємо сценарій пару разів, щоб перевірити, що все працює безперебійно, змінюємо те, що потрібно (він не повинен містити помилок, інакше cron буде повторювати помилку лише знову і знову). Тепер додамо завдання до нашого crontab.

Додайте завдання до crontab

Ми виконуємо видання crontab за допомогою crontab -e, в деяких дистрибутивах (таких як Ubuntu) це дає нам можливість вибрати потрібний текстовий редактор, решта нам залишається vi. Файл crontab виглядатиме приблизно так.

# mh dom mon dow користувацька команда

де:

  • m відповідає хвилині виконання сценарію, значення коливається від 0 до 59
  • h точний час, обробляється 24-годинний формат, значення знаходяться в діапазоні від 0 до 23, при 0 до 12:00 опівночі.
  • подарунок відноситься до дня місяця, наприклад, ви можете вказати 15, якщо ви хочете запускати кожні 15 днів
  • вниз означає день тижня, він може бути числовим (від 0 до 7, де 0 і 7 - неділя) або першими 3 буквами дня англійською мовою: пн, вівторок, ср, чт, пт, сб, сонце.
  • користувач визначає користувача, який буде виконувати команду, це може бути root, або інший користувач, якщо він має дозвіл на виконання сценарію.
  • команда відноситься до команди або абсолютного шляху виконання сценарію, приклад: /home/usuario/scripts/update.sh, якщо він викликає сценарій, він повинен бути виконуваним

Щоб зрозуміти, пояснимо кілька прикладів завдань cron:

15 10 * * * користувач /home/user/scripts/update.sh

Він запускатиме скрипт update.sh о 10:15 щодня

15 22 * * * користувач /home/user/scripts/update.sh

Він запускатиме скрипт update.sh о 10:15 щодня

00 10 * * 0 root apt-get -y update Кореневий користувач

Він буде оновлюватися щонеділі о 10:00

45 10 * * оновлення apt-get -y sun root

Користувач root запускатиме оновлення щонеділі (неділя) о 10:45 ранку

30 7 20 11 * користувач /home/usuario/scripts/update.sh

20 листопада о 7:30 користувач запустить сценарій

30 7 11 11 користувач sun /home/usuario/scripts/pastel_con_velitas.sh

11 листопада о 7:30 ранку, а це неділя, користувач святкуватиме свого сисадміна (тобто мене)

01 * * * * користувач /home/usuario/scripts/molestorecordatorio.sh

Дратівливе нагадування щохвилини щогодини щодня (НЕ рекомендується).

З ними ще можна впоратися спеціальні асортименти:

30 17 * * 1,2,3,4,5

О 5:30 вдень щодня з понеділка по п’ятницю.

00 12 1,15,28 * *

О 12 кожного першого, п’ятнадцятого та 28 числа кожного місяця (ідеально підходить для нарахування заробітної плати)

Якщо це бентежить, crontab обробляє спеціальні рядки для визначення цих діапазонів.

@reboot Запустити один раз, під час запуску
@yearly працює лише раз на рік: 0 0 1 1 *
@ щорічно так само, як @yearly
@monthly працює раз на місяць, перший день: 0 0 1 * *
@weekly Weekly перша хвилина першої години тижня. 0 0 * * 0 ″.
@ щоденно щодня, о 12:00. 0 0 * * *
@midnight те саме, що @daily
@hourly у першу хвилину кожної години: 0 * * * *

Його використання дуже просте.

@hourly user /home/user/scripts/molestorecordatorio.sh @ щомісячний користувач /home/user/scripts/backup.sh @daily root apt-get update && apt-get -y upgrade

Останнє, але не менш важливе:

Cron управління роботою

файл crontab

Замініть наявний файл crontab на визначений користувачем файл

кронтаб -e

Відредагуйте файл користувача crontab, кожен новий рядок буде новим завданням crontab.

crontab -l

Перелічіть усі завдання користувача crontab

кронтаб -д

Видаліть crontab користувача

crontab -c реж

Визначає каталог користувача crontab (він повинен мати дозволи користувача на запис та виконання)

користувач crontab -u

префікс для обробки crontab іншого користувача, приклади:

$ sudo crontab -l -u root $ sudo crontab -e user2 #crontab -d -u користувач

Цей інструмент, як і багато інших, можна розглянути більш детально та детальніше в:

Дякую Лукаїне!

48 коментарі, залиште свій

Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   Альваро Ортіс - сказав він

    Тьфу ... трохи заплутано.

  2.   тонізуючий - сказав він

    * / 30 відсутній (у полі хвилин), який виконується кожні 30 хвилин ...

    1.    erm3nda - сказав він

      Саме це я збирався коментувати, поки не вирішив переглянути коментарі 😀
      Цей модифікатор є дуже важливою інформацією та чимось дуже корисним.

      1.    КІКА - сказав він

        Здрастуйте!
        Зараз я тестую конфігурацію кожні 45 хвилин.

        * / 45 * * * *, а інструкція виконується через 45 хвилин кожної години І кожної години. Тобто:

        Він триває о 3:45, потім 4:00, 4:45, потім 5:00, 5:45, 6:00, 6:45 тощо.

        У мене щось не так? Що я можу зробити, щоб зробити це лише кожні 45 хвилин або принаймні раз на 45 хвилин щогодини.

    2.    КІКА - сказав він

      Здрастуйте!
      Зараз я тестую конфігурацію кожні 45 хвилин.

      * / 45 * * * *, а інструкція виконується через 45 хвилин кожної години І кожної години. Тобто:

      Він триває о 3:45, потім 4:00, 4:45, потім 5:00, 5:45, 6:00, 6:45 тощо.

      У мене щось не так? Що я можу зробити, щоб зробити це лише кожні 45 хвилин або принаймні раз на 45 хвилин щогодини.

  3.   Млявий - сказав він

    Привіт, супер корисна інформація для уточнення роботи cron.
    байтів

  4.   Млявий - сказав він

    для *

  5.   Мисливець - сказав він

    Відмінно, дякую за роз’яснення, як працює cron .. давайте трохи покладемо руку 🙂

  6.   Яків - сказав він

    Наскільки я розумію, цей рядок буде виконаний о 10:15, виправте мене, якщо я помиляюся
    Ну там написано 10:15 ранку
    15 22 * * * користувач /home/user/scripts/update.sh

  7.   Agustin - сказав він

    Привіт! дуже гарна інформація.
    Для виконання сценарію кожні півгодини рядок, який слід додати до CronTab, буде таким: "30 * * * * root Scrip.sh" Правильно? Дуже дякую!

  8.   давайте використовувати linux - сказав він

    Ні. Якщо я добре пам’ятаю, для цього вам потрібно поставити / 30 * * * * root Scrip.sh.
    Тобто додайте / до 30.
    На здоров’я! Павло.

  9.   Джонатан - сказав він

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

    Я хочу запустити сценарій в певний час і поставити

    на прикладі -f /home/mi_user/Desk/script.sh 18:08

    і сценарій не виконується на екрані, тобто в терміналі, він виконується у фоновому режимі?

    І з cron те саме відбувається зі мною, я редагую файл crontab за допомогою "crontab -e"

    в кінці я додаю цей рядок:

    46 19 my_user /home/mi_user/Desk/script.sh

    і він нічого не робить, не показує сценарій.

    Будь-яка пропозиція? Щиро дякуємо та просимо вибачення за незручності

    1.    давайте використовувати linux - сказав він

      Щоб термінал з’явився, можливо, доведеться запустити термінал і передати сценарій як параметр.

      Наприклад:

      lxterminal -e "my_user /home/my_user/Desk/script.sh"

      Параметр, який слід використовувати, може відрізнятися залежно від емулятора терміналу, який ви використовуєте.

      Сподіваюся, це спрацює.

      Обійми! Павло.

  10.   патретки - сказав він

    Внесок оцінений.

    10 балів !!

    вітаю2 !!

  11.   Rodolfo - сказав він

    Щиро дякую, це мені дуже допомогло прояснити деякі речі, повна подяка, за детальнішими відомостями чи сумнівами я перейду на СТРАНИЦЮ ЛЮДИНИ, ще раз вітаю

  12.   джихір - сказав він

    Дядько, велике спасибі, я читав і тестував приклади. велике спасибі ... це дуже зрозуміло. Ура

  13.   Геовані - сказав він

    Я використовував ubuntu Server 12.04.2 LTS, і для видалення списку завдань користувача використовується версія crontab, яка у мене є, crontab -r (та -l, як сказано в цьому посібнику). Звичайно, це питання версій.

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

    PS (я шукав за допомогою locate і whereis crontab, але він повернув лише вищезазначену адресу та інший зашифрований файл, тому, якщо виконувався той, що знаходиться в / etc / crontab, але при виконанні команди crontab -e мій з'явиться з усіма завданнями, які я визначив) де зберігався цей файл '???? З повагою. Я завжди вхід із root.

  14.   Себастьян - сказав він

    Відмінно, дуже корисно !!!

  15.   ммм - сказав він

    Привіт, я хотів би зробити це ………… «15 10 * * * root ifdown eth0»

    це означає, що в певний час мережева карта вимикається ………… ну, я помістив її в crontab, і вона не спрацювала …… .. що там?

    Saludos у Gracias

  16.   Мігель - сказав він

    Ви пропустили визначення "mon" після заголовка "Додати завдання до crontab"

    Стаття все ще приємна, cron надзвичайно корисна.

  17.   Оскар - сказав він

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

    є decdir Я хочу переглянути історію дій, здійснених у минулому цього файлу, і я хочу побачити, хто його змінив, і дату

    спасибі

  18.   Оскар - сказав він

    Я хочу перевірити історію змін цього

    як я можу це зробити

    спасибі

  19.   Андрес Ледо - сказав він

    Доброго ранку,

    Я думаю, що у сценарії ubuntu ви помилились, ви поставили оновлення ap-get -y замість оновлення apt-get -y. (Ви залишили t).

    Привітання.

    1.    давайте використовувати linux - сказав він

      Так само є. Дякую!
      Обійми! Павло

  20.   Габріель - сказав він

    Я хочу знати, як створити файл cron, щоб мати можливість вказувати час, коли він виконується, каталог тощо.

  21.   Валентин - сказав він

    Дякуємо за роз'яснення операції та основні команди для cron, тепер трохи розважимося.

  22.   Sander - сказав він

    Щоразу, коли я шукаю інформацію на будь-яку тему, пов’язану з Gnu / Linux, я кружляю навколо, щоб завжди знаходити в 90% випадків найкращий підручник у цій чудовій спільноті, я думаю, що відтепер я буду починати тут, а потім деінде.

    привіт

    1.    давайте використовувати linux - сказав він

      Спасибі Сандере! Обійми! Павло.

  23.   дарйо - сказав він

    dom = день місяця
    dow = день тижня
    це простіше, якщо ви спілкуєтесь

  24.   Пасхальний - сказав він

    Щиро дякую, дуже повно та добре пояснено.

  25.   Максилія - сказав він

    Це те саме, що дав нам мій вчитель операційних систем, я нічого не міняю, тепер я бачу, чому клас такий поганий. -.

  26.   Марсело - сказав він

    За оцінками,

    Запит, чи можна обмежити тривалість завдання?
    Наприклад, у мене є завдання, яке повторюється кожні 5 хвилин, при повторенні, якщо це завдання все ще активне, нехай воно його вбиває і запускає знову.

    Спасибі,
    Марсело. -

    1.    давайте використовувати linux - сказав він

      Привіт, Марсело!

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

      Обійми, Пабло.

  27.   aj - сказав він

    хороший пост.
    Яка команда для кожного терміналу для додавання завдань до crontab (без введення crontab та додавання їх вручну на 'crontab -e' або заміни crontab іншим crontab на 'crontab файл').
    Ідея полягає у створенні зовнішнього сценарію для додавання завдань до crontab
    Грекіас

    1.    Девід - сказав він

      мені здається, що ви можете використовувати 'echo' все, що хочете додати '| cat >> 'шлях до cronotab (/ etc / cronotab)' «

  28.   Рафаель Віра - сказав він

    Як би виконувався вираз кожні 3 дні?

  29.   Хосе Антоніо - сказав він

    Здравствуйте.

    У мене проблема з виконанням завдання cron.

    Я запускаю наступне завдання з cronta -e:

    01 * * * * root /home/user/script/mfile.sh

    але завдання не виконано. Я перевірив, що myfile.sh має дозвіл на виконання, і що користувач, який його виконує, є root.

    Я запускаю те саме завдання в / etc / crontab, і після перезапуску служби воно також не працює для мене.
    Вміст myfile.sh - це команда, яка оновлює БД, і якщо я запускаю її в консолі, вона працює.
    будь-яка ідея, в чому проблема?

    1.    Фредд - сказав він

      Ймовірно, що користувач бази даних не має всіх дозволів, і спочатку вам доведеться експортувати змінні середовища із вашого механізму бази даних.
      Наприклад, у db2 цей рядок буде переходити на початок сценарію
      . / home / db2inst1 / sqllib / db2profile

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

  30.   LA3 - сказав він

    Я не знав, що мені доведеться перезапустити кронд, я боровся з цим деякий час

  31.   Кенія - сказав він

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

  32.   Ісус - сказав він

    хороший день!!

    Як зупинити процес, який виконується в crontab?

  33.   Ісус - сказав він

    процес * …………

  34.   Julianna - сказав він

    Чи може ви допомогти мені? eu tenho um script від Minha від автора, який не працює, жоден crontab! Jб dei всі дозволи, а не конкретний cron або користувач, який може це виконати - майже нічого не відбувається! Я хотів би знати, чи можете ви допомогти мені, деякі інші речі не спрацьовують! Vlws

  35.   Антокс - сказав він

    Як би ви поставили завдання запускати кожен останній день місяця (дні: 31-30-28)?

  36.   тферчо - сказав він

    Як ви вже знаєте, команда su використовується для зміни користувача в консолі. Якщо я використовую команду su таким чином: "ваш користувач" змінює користувача, але без належних налаштувань "користувач", якщо я запускаю su як: "su - user", змініть користувача, завантажуючи налаштування користувача. За допомогою cron я вказую користувача, але як завантажити налаштування цього користувача?

  37.   Грабувати - сказав він

    А якщо я хочу це зупинити?

  38.   Регі - сказав він

    Привіт
    Я не знаю, що я роблю неправильно, але я дотримуюсь інструкцій і нічого не виконується. Я намагався:
    59 * * * * / usr / bin / gedit
    * * * * * / usr / bin / gedit
    * * * * * root / usr / bin / gedit
    * * * * * usr / bin / test.sh
    * * * * * root usr / bin / test.sh

    і зовсім нічого. Він нічого не виконує. Я перезавантажився і все.

  39.   Феркос - сказав він

    Велике спасибі