Crontab – công cụ thực hiện theo chu kỳ

Cronjob là gì?

1 bài toán nho nhỏ, bạn lỡ thích 1 cô bé, cô bé ấy rất đáng yêu, đã thế còn dịu dàng. Để lấy lòng cô bé đó, bạn muốn mỗi sáng thức dậy bạn đều nhắn cho cô ấy 1 tin nhắn lúc 6h: “Chúc em 1 ngày mới tốt lành”. Nhưng bạn thì lười vãi chưởng và bạn không muốn thức dậy lúc ấy.

gửi tin nhắn mỗi sáng được coi như là 1 công việc được làm tự động và được lặp theo 1 chu kỳ như vậy được gọi là cronjob.

Trên linux hay osx, ứng dụng đó có tên là crontab ( được viết tắt từ CRON TABle)

Hầu hết crontab sẽ có sẵn trên linux hay osx, nhưng nếu không có bạn có thể cài vô.

ở với redhat distribution như centos bạn có thể dùng lệnh:

# install
yum install cronie

Start crontab và tự động chạy mỗi khi reboot:

# auto start
service crond start
chkconfig crond on

Crontab sẽ bao gồm các lệnh để thực thi, câu lệnh của crontab:

# command
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }

và ý nghĩa của các lệnh:

# means
crontab -e: tạo hoặc chỉnh sửa file crontab 
crontab -l: hiển thị file crontab
crontab -r: xóa file crontab

Cấu trúc của crontab:

Một crontab file có 5 trường xác định thời gian, cuối cùng là lệnh sẽ được chạy định kỳ, cấu trúc như sau:

# structure
* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

  • * đầu tiên tương ứng với phút, trong khoảng 0 -> 59 phút
  • * thứ 2 tương ứng với giờ, và trong khoảng 0 -> 23 giờ
  • * thứ 3 tương ứng ngày, giới hạn trong khoảng 1 -> 31
  • * thứ 4 tương ứng tháng, giới hạn trong khoảng 1->12
  • * thứ 5 tương ứng ngày của tuần, giới hạn trong khoảng 0 -> 6, và 0 là chủ nhật
  • Nếu không khai báo số cụ thể thì bạn sẽ để *, kí hiệu này thay thế cho tất cả các con số trên. 
  • đặc biệt bạn có thể dùng @reboot để chạy lệnh nào đó khi mà server boot lại. Chẳng hạn khởi động một số chương trình không tự khởi động lại được khi server bị reboot. @reboot <start some program>
  • Ngoài ra bạn còn có thể dùng các thiết lập đặc biệt khác:
    @hourly : chạy hàng giờ vào phút thứ 0
    @daily : chạy hàng ngày vào 00:00
    @monthy : chạy hàng tháng vào 00:00 của ngày đầu tiên của mỗi tháng
    @yearly : chạy hàng năm vào 00:00 của ngày đầu tiên của mỗi năm

Các bạn có thể vô trang: https://crontab.guru/ để biết thêm về example.

Ví dụ cụ thể:

Mình muốn cứ 20 phút thì sẽ thực hiện 1 đoạn bash shell thì mình sẽ thực hiện các bước như sau:

Gõ lệnh:

# edit
crontab -e

mặc định sẽ là dùng vim, nhưng bạn muốn dùng nano bạn có thể dùng:

# edit
EDITOR=nano crontab -e

tiếp đó bạn thêm task của crontab:

# task
20 * * * * sh /Users/cee/Desktop/cron/cron.sh

chú ý là /Users/cee/Desktop/cron/cron.sh là đường dẫn tuyệt đối, bạn có thể cd vô folder chứa file .sh đó rồi dùng lệnh pwd để ra đường dẫn chứa file. Và 1 điều rất quan trọng là bạn phải set quyền excute cho file sh nhé:

chmod +x cron.sh

Xong save là được. Nếu Ok nó sẽ báo:

# display
crontab: installing new crontab

Mặc định cron gửi email cho người thực thi cron job, nếu bạn muốn tắt chức năng gửi email này đi thì hãy thêm đoạn sau vào cuối dòng

# 
>/dev/null 2>&amp;1

Ngoài ra nếu bạn muốn kiểm tra xem log nó ra sao thì bạn cần thêm đường dẫn và tên file log của bạn vào sau, và nó sẽ như sau:

# logs
* * * * * sh /Users/cee/Desktop/cron/cron.sh >> /Users/cee/Desktop/cron/script_output.log 2>&amp;1

Với mỗi lần chạy với > thì kết quả sau sẽ ghi đè lên kết quả chạy trước. Do đó nếu muốn lấy kết quả của tất cả các lần chạy thì bạn cần phải append vào file bằng cách dùng 2 dấu >>. Nhưng lưu ý là file của bạn có thể sẽ rất lớn nếu cron task được chạy hàng ngày.

Leave a Reply

Your email address will not be published. Required fields are marked *