[En/Vi] CronJob & CronTab! Everything you need to know


[EN] You've probably heard of systems that perform automated database backups, automatically send mail, or simply send a reminder periodically. There are many ways to do that, but for Unix-based OSs (linux, ubuntu, centos, etc.) using Cron is one of the most popular and easiest ways.

What is Cron?
  • Cron: Just like Windows has Task Schedule, Unix-based OSs have Cron. Cron is a method for scheduling repetitive tasks with well-defined cycles. It supports the automation of maintenance and system administration.
  • Cronjob: Commands that execute preset actions at a given time, structured as follows: minutes hour date month day-in-week commands
  • Crontab: is the location where you write cronjob

Crontab command lines
  • -e: Open your cronjob where you can edit, add new or delete an arbitrary cronjob. The default editing tool is Vim. You can insert (i) and save (wq).
  • -l: This command lists all the cronjobs that are being used on the system.
  • -u [user]: Specify user to run cronjobs
  • -r: Delete the existing cronjobs

You can combine the commands in the contab as follows:
  • Crontab -l -u [user]: This command allows you to check the cronjob of a specified user.
  • Crontab -r -u [user]: This command allows you to delete cronjob commands of a specified user.

Note: Sometimes you will have permission issues, you need to type sudo first to be able to execute commands to view or delete cronjob of users.
For example: Below I demo a cronjob checking of user locnd and perform a delete operation.

1-cron.gif


CronJob’s structure

# ┌───────────── Minute (0 - 59)
# │ ┌───────────── Hour (0 - 23)
# │ │ ┌───────────── Days of a month (1 - 31)
# │ │ │ ┌───────────── Month (1 - 12)
# │ │ │ │ ┌───────────── Days of the week (0 - 6) (Start with Sunday - 0);
# │ │ │ │ │                                       In some old systems, 7 is used for Sunday)
# │ │ │ │ │
# │ │ │ │ │
# *  *  *  *  *  Commands

  1. Minutes: determines at which minute(s) of hour cronjob will run, values from 0 - 59 (Equivalent to 60 minutes)
  2. Hour: determines in which hour(s) cronjob will run, values from 0 - 23 (equivalent to 24 hours)
  3. Day of the month: determines in which day(s) of the month cronjobs will run, values from 1 to 31 (Equivalent to the longest 31 days, with the months that have fewer days, cronjob will automatically ignore those non-exist days)
  4. Month: determines in which month(s) of the year cronjobs will run, values from 1 to 12 (Equivalent to 12 months),
  5. Day of the week: Determine in which day of the week cronjobs will run, values from 0 to 6 (Equivalent to 7 days of the week from Sunday to Saturday. The starting point is 0 - Sunday and 7 is Saturday ).
  6. Commands: The commands you want to execute at the specified time of cronjob. It can be a Unit command line or a function of the project you are working on.

Characters and special settings:
  • * : Determines the cronjob execution at the moment  that * sign is set.
    • E.g: * * * * *functionA This means that functionA will run at every minute, every hour, every day.
  • , : Determines specified cronjobs execution time.
    • E.g: 15,30 1,6,12,15 * * * functionA this means function A will run at minute 15 and 30 past hour 1, 6, 12, and 15
  • / : Determine the cronjob execution at a given time interval. There must be a * sign in front of /.
    • E.g: */15 1,6,12,15 * * * functionA this means functionA will run at every 15th minute past hour 1, 6, 12, and 15
  • - : Determines a continuous time period.
    • E.g:  */15 6-9 * * * functionA This means functionA will run at every 15th minute past every hour from 6 through 9.

  • In addition, there are special settings as follows:
    • @yearly (or @annually): Runs once a year on the first hour of January 1, the equivalent syntax: 0 0 1 1 *
    • @monthly: Runs once a month at midnight of the first day of the month, equivalent syntax: 0 0 1 * *
    • @weekly: Runs once a week at 00:00 on Sunday, equivalent syntax: 0 0 * * 0
    • @daily: Runs once a day at midnight, equivalent syntax 0 0 * * *
    • @hourly: Runs hourly at the beginning of the hour, equivalent syntax 0 * * * *
    • @reboot: Runs every time the system reboots. ---------------------------------------------------------------------------------------------------

[VI] Chắc hẳn bạn đã nghe tới những hệ thống tự động thực hiện việc backup database, tự động gửi mail hoặc đơn giản hơn là tự gửi 1 tin nhắn nhắc nhở định kỳ. Có nhiều cách làm việc đó, nhưng với những OS dựa trên kiến trúc Unix (linux, Ubuntu, Centos,.. ) việc sử dụng Cron là một trong những cách rất phổ biến và dễ dàng.


Vậy Cron là gì?

  • Cron: Giống như Windows có Task Schedule trong Các OS nhân Unix có Cron. Cron là một phương pháp để lập kế hoạch các nhiệm vụ lặp đi lặp lại với chu kỳ được xác định rõ ràng. Nó thuường giúp việc tự động hóa bảo trì hoặc quản trị hệ thống.
  • Cronjob: Là các lệnh thực thi hành động đặt trước vào thời điểm nhất định, cấu trúc như sau: phút giờ ngày tháng ngày-trong-tuần lệnh-chạy-chương-trình
  • Crontab: là nơi chứa các cronjob bạn viết ra


Các lệnh trong Crontab
  • -e: Mở nơi chứa các cronjob của bạn, ở đây bạn có thể chỉnh sửa, thêm mới hoặc xoá 1 cronjob tuỳ ý. Công cụ chỉnh sửa mặc định là Vim các bạn có thể insert (i) và lưu (:wq) như bthuong.
  • -l: Đây là lệnh liệt kê tất cả các cronjob của use bạn đang sử dụng trên hệ thống.
  • -u [user]:  Xác định user sẽ chạy cronjob, nếu không muốn chạy bằng tài khoản hiện tại.
  • -r: Xoá các cronjob hiện có

Bạn có thể kết hợp các lệnh trong contab như sau:
  • Crontab -l -u [user]: Câu lệnh này giúp bạn có thể kiểm tra cách cronjob của 1 user nào đó.
  • Crontab -r -u [user]: Câu lệnh này giúp bạn xoá các câu lệnh cronjob của 1 user nào đó.
Một lưu ý đôi khi bạn vấn đề về quyền, bạn cần sudo trước để có thể thực hiện các lệnh xem hoặc xoá cronjob của user nào đó.
Ví dụ: Dưới đây mình demo việc check cronjob của user locnd và thực hiện việc xoá, các bạn chú ý mình có thêm sudo đằng trước, vì nếu không có hệ thống sẽ báo bạn k có quyền, mình đã nhập password từ trước nên khi chạy lệnh không có bước hỏi password, các bạn làm lần đầu sẽ cần nhập password trước.


1-cron.gif


Cấu trúc của CronJob

# ┌───────────── Phút (0 - 59)
# │ ┌───────────── Giờ (0 - 23)
# │ │ ┌───────────── Ngày trong tháng (1 - 31)
# │ │ │ ┌───────────── Tháng (1 - 12)
# │ │ │ │ ┌───────────── Ngày trong tuần (0 - 6) (CN tới thứ 7;
# │ │ │ │ │                                       Một số hệ thống số 7 cũng là CN)
# │ │ │ │ │
# │ │ │ │ │
# *  *  *  *  *  Câu lệnh chạy chương trình

  1. Phút: xác định cronjob sẽ chạy ở phút thứ mấy trong giờ, giá trị từ 0 - 59 (Tương đương 60 phút)
  2. Giờ: xác định cronjob sẽ chạy ở giờ thứ mấy trong ngày, giá trị từ 0 - 23 (Tương đương 24 tiếng)
  3. Ngày trong tháng: xác định cronjob sẽ chạy ở ngày thứ mấy trong tháng, giá trị từ 1 - 31 (Tương đương với những tháng dài nhất có 31 ngày, với những tháng ít ngày hơn, cronjob sẽ tự động bỏ qua những ngày không có trong tháng đó)
  4. Tháng: xác định cronjob sẽ chạy ở tháng thứ mấy trong năm, giá trị từ 1 - 12 (Tương đương 12 tháng)
  5. Ngày trong tuần: xác định cronjob sẽ chạy ở ngày thứ mấy trong tuần, giá trị từ 0 - 6 (Tương đương 7 ngày trong tuần từ CN tới thứ 7. Điểm bắt đầu số 0 sẽ là CN và số 6 sẽ là thứu 7).
  6. Câu lệnh chạy chương trình: Các câu lệnh bạn muốn thực thi vào thời điểm định sẵn của cronjob. có thể là 1 câu lệnh của Unit hay dẫn vào functions của project bạn đang chạy.
Các ký tự và các thiết lập đặc biệt:
  • *: xác định việc thực thi cronjob ở mọi mốc thời điểm trong trường mà dấu * được đặt.
    • Ví du: * * * * * functionA điều này có nghĩa là functionA sẽ chạy mọi phút, mọi giờ, mọi ngày. Cứ cách 1 phút lệnh được thực thi 1 lần.
  • , : xác định việc thực thi cronjob ở nhiều thời điểm được xác định rõ ràng.
    • Ví dụ: 15,30 1,6,12,15 * * * functionA điều này có nghĩa là functionA sẽ chạy vào phút thứ 15 và 30 của 1h 6h 12h 15h hàng ngày.
  • / : xác định việc thực thi cronjob ở mỗi khoảng thời gian nhất định. Cần có dấu * đằng trước / để đúng cú pháp.
    • Ví dụ */15 1,6,12,15 * * * functionA điều này có nghĩa là functionA sẽ chạy vào phút thứ 15 30 45 60 của 1h 6h 12h 15h hàng ngày.
  • - : xác định 1 khoảng thời gian liên tục.
    • Ví dụ */15 6-9 * * * functionA điều này có nghĩa là functionA sẽ chạy vào phút thứ 15 30 45 60 của 6h 7h 8h 9h hàng ngày.

  • Ngoài ra có những thiết lập đặc biệt như sau:
    • @yearly (or @annually): Chạy một lần trong năm vào giờ đầu tiên của ngày 1 tháng 1, cú pháp tương đương 0 0 1 1 *
    • @monthly: Chạy mỗi tháng một lần vào lúc nửa đêm của ngày đầu tiên của tháng, cú pháp tương đương 0 0 1 * *
    • @weekly: Chạy mỗi tuần một lần vào lúc 0h Chủ Nhật, cu phap tuong duong 0 0 * * 0
    • @daily: Chạy mỗi ngày một lần vào lúc nửa đêm, cú pháp tương đương 0 0 * * *
    • @hourly: Chạy mỗi giờ một lần vào đầu giờ, cú pháp tương đương 0 * * * *
    • @reboot: Chạy mỗi khi hệ thống bật lên sau mỗi lần reboot.


Website supports cronjob statements definition: https://crontab.guru/
Reference:
  • http://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html



If you liked this article

Let's subscribe the updates of Scuti!
Share on Google Plus

About Anonymous

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

1 Comments:

  1. Such an excellent and interesting blog, do post like this more with more information, this was very useful. Salesforce Training Canada   

    ReplyDelete