20 tháng 2, 2010

Crontab

Bài viết được dịch từ blog của Kevin Van Zonneveld.
Bạn cần thực thi một công việc nào đó một cách lặp lại, ví dụ như cứ 1 giờ lại dọn rác một lần, hoặc cứ mỗi khi khởi động máy lại chạy 1 script của mình... Trong hệ thống UNIX cũng như Linux có một công cụ rất hữu hiệu phục vụ cho công việc này, đó chính là crontab. Crontab được xuất phát từ cron - tiếng Hy Lạp là thời gian, còn tab là viết tắt của từ table. Lệnh crontab xuất hiện trên hầu hết các hệ thống UNIX hoặc tương tự UNIX. Để xem crontab thực thi những gì trên hệ thống của mình, bạn có thể gõ lệnh sau ở command:
sudo crontab -l
Để chỉnh sửa thành phần cronjob bạn dùng lệnh:
sudo crontab -e
Hệ thống sẽ mở cronjobs bằng một trình soạn thảo (vi hoặc pico...), cronjobs sẽ được ghi theo định dạng như sau:
* * * * * /bin/execute/script.sh
Bạn có thể thấy 5 ngôi sao ở định dạng trên, các ngôi sao này biểu diễn cho các phần thời gian theo thứ tự dưới đây:
  1. Minute (0-59)
  2. Hour (0-24)
  3. Day of month (1-31)
  4. Month (1-12)
  5. Day of week (0-6, 0: Sunday)
Nếu trong cronjobs bạn để dấu sao * thì hệ thống sẽ hiểu điều đó là every. Có thể nói vậy chưa rõ ràng, chúng ta hãy cùng xem qua ví dụ sau để hiểu rõ hơn:
* * * * * /bin/execute/script.sh
Lúc này hệ thống sẽ thực thi script.sh:
  1. Every minute
  2. Every hour
  3. Every days of month
  4. Every month
  5. Every days of week
Chúng ta thử xem xét dòng trong cronjobs:
0 1 * * 5 /bin/execute/this/script.sh
Dòng trên sẽ được diễn giải như sau:
  1. Minute: 0
  2. Hour: 1
  3. Day of month: * (every)
  4. Month: * (every)
  5. Day of week: 5 (=Friday)
Và hệ thống sẽ thực thi script này vào 1 giờ sáng các ngày thứ 6 trong tuần. Có thể thấy tuy có dấu * ở Day of monthMonth nhưng hệ thống không thực thi script ở tất cả các ngày trong tháng, điều đó có nghĩa rằng khi đã xác định ngày trong tuần thì việc để dấu * ở Day of monthMonth sẽ không còn mang ý nghĩa every. Ở ví dụ này, nếu ta thay dấu * ở vị trí Month bằng một số cụ thể (4 chẳng hạn) thì hệ thống sẽ thực thi script vào các ngày thứ 6 trong tháng 4. Còn nếu thay dấu * ở vị trí Day of month bằng một số bất kỳ (22 chẳng hạn) thì hệ thống sẽ thực thi script chỉ vào 1 giờ ngày thứ 6 nếu ngày đó là ngày 22 của tháng.
Ở các phần trên đã giới thiệu đến các bạn cách tạo lịch để thực thi script vào một giờ, phút, ngày... cụ thể. Nhưng nếu bạn muốn thực thi script cứ 10 phút một lần, hoặc 30 phút một lần thì sao? Crontab có làm được điều đó không? Thật may mắn là những người tạo lập nên lệnh crontab đã tính đến khả năng này, và cấu trúc cronjob như sau:
0,10,20,30,40,50 * * * * /bin/execute/script.sh
Dòng này yêu cầu hệ thống thực thi script vào các phút 0, 10, 20, 30, 40, 50 của các giờ. Nhưng viết như vậy hơi dài, bạn có thể viết ngắn gọn hơn bằng cách:
*/10 * * * * /bin/execute/script.sh
Điều này cũng được làm hoàn toàn tương tự với các vị trí * khác.
Crontab còn cung cấp cho bạn một số tùy chọn thay cho 5 dấu * đã nêu như sau:
  • @reboot --- run at start up
  • @yearly ---run once a year
  • @annually --- same as @yearly
  • @monthly --- run once a month
  • @weekly --- run once a week
  • @daily --- run once a day
  • @midnight --- same as @daily
  • @hourly --- run once a hour
Đến đây bạn đã có thể làm chủ được crontab rồi. Crontab thực sự là công cụ rất hữu ích nếu như bạn thường xuyên phải làm một công việc theo lịch trình :D. Một lần nữa cám ơn Kevin. :)

Không có nhận xét nào:

Đăng nhận xét