Bạn có một trang web và bạn muốn sao lưu toàn bộ dữ liệu website hàng ngày một cách tự động? Hoặc bạn cần renew chứng chỉ SSL cứ sau 3 tháng một lần? Nếu bạn làm bằng tay có khi quên lúc nào không hay.
Tất cả những tác vụ cần thực hiện tự động vào một thời điểm nào đó thì đều có thể làm tự động. Linux có một cơ chế lập lịch để thực hiện các tác vụ tự động gọi là Cron.
Khái niệm cron trong Linux cũng tương tự như Alarm trong Android, hay Task Schedule trên Window vậy.
Mình là người cũng rất hay sử dụng crontab để thực hiện những tác vụ tự động. Đơn giản vì mình lười nên mình ghét làm thủ công. Bài viết này mình sẽ chia sẻ toàn bộ kiến thức cũng như hướng dẫn sử dụng crontab để bạn có thể làm chủ được công cụ hữu ích này.
Chúng ta bắt đầu nhé!
Nội dung chính của bài viết
#Crontab là gì?
Cron là cách để tạo và thực hiện các tác vụ theo một lịch trình định kì ở chế độ nền. Trong đó, Cron job là tập hợp các tác vụ cần thực hiện. Crontab là nơi lưu trữ các cronjob, trên linux cũng có sẵn một chương trình cũng có tên là crontab để chỉnh sửa lịch trình.
Về ứng dụng của crontab thì nhiều vô kể, và hầu như ứng dụng nào cũng có sử dụng đến crontab.
Bạn cũng có thể sử dụng nó để tự động sao lưu, đồng bộ, cập nhật dữ liệu cho website. Giả sử hàng ngày vào lúc 00:00 bạn muốn copy một file log từ server về máy local của bạn để hôm sau báo cáo cho sếp (tất nhiên server này bạn cần thiết lập kết nối SSH trước đó rồi). Đây là lúc cần đến crontab.
Thêm một ví dụ nữa nhé!
Lấy luôn trang web này (VNTALKING), mình rất hay viết bài và lên lịch để xuất bản bài viết vào đúng 9 giờ sáng thứ 3 hàng tuần. Tính năng Schedule của wordpress đã giúp mình thực hiện điều đó một cách dễ dàng mà không phải ngồi canh đến giờ mới nhấn nút publish bài viết. Vì vậy, mình có thể viết hàng loạt bài viết rồi lên lịch để publish bài từ từ 🙂
Tất nhiên bạn có thể làm việc đó thủ công nhưng dựa vào Crontab bạn có thể làm việc đó tự động dễ dàng không tốn một giọt mồ hôi nào cả.
#Cơ chế làm việc và cách sử dụng Crontab
Một crontab là một tệp văn bản đơn giản chứa danh sách các lệnh có nghĩa và được chạy tại các thời điểm được chỉ định. Nó được chỉnh sửa bằng lệnh crontab.
Các lệnh trong file crontab được kiểm tra bởi trình cron daemon và thực thi chúng trong nền hệ thống.
Một số lệnh thường dùng:
- 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 - cd /etc/cron.d : Nếu crobtab được register bằng system cron
Mỗi người dùng (bao gồm cả root) đều có một tệp crontab. Cron daemon kiểm tra tệp crontab của người dùng bất kể người dùng có thực sự đăng nhập vào hệ thống hay không.
Phần lớn VPS của các nhà cung cấp nổi tiếng như Linode, Vultr, DO… đều cài sẵn crontab sau khi khỏi tạo một VPS mới. Tuy nhiên, với bạn nào sử dụng Dedicated server, tự cài đặt OS từ đầu thì có thể phải cài đặt thêm crontab.
Cài đặt Crobtab
Để cài đặt crontab trên Linux cũng rất đơn giản, chỉ một câu lệnh là xong.
Trên Ubuntu/Debian:
sudo apt-get install cron
Trên CentOS/Red Hat Linux:
yum install cronie
Sau khi cài đặt xong, thử kiểm tra xem nó đã cài đặt thành công rồi hay chưa bằng lệnh:
service crond status
Nếu output như dưới đây thì là OK.
crond (pid 4370) is running...
Nếu crontab vẫn chưa chạy thì bạn tự khởi động crontab và thiết lập tự động chạy mỗi khi reboot như sau:
service crond start chkconfig crond on
#Cấu trúc của Crontab
Một lệnh crobtab thường gồm 3 phần:
- Trường thời gian: gồm 5 chỉ số thời gian để xác định một lịch trình.
- Trường user-name: Xác định tài khoản nào được phép chạy crontab này. Nếu không chỉ định sẽ sử dụng user mặc định đã register crontab.
- Tác vụ cần thực thi: tác vụ này có thể là một lệnh hoặc nhiều lệnh. Nếu có nhiều lệnh sẽ cách nhau bởi dấu chấm phẩy.
* * * * * user-name command to be executed - - - - - | | | | | | | | | +----- day of week (0 - 6) (Sunday=0) | | | +------- month (1 - 12) | | +--------- day of month (1 - 31) | +----------- hour (0 - 23) +------------- min (0 - 59)
Ví dụ: Nếu bạn để cả 5 chỉ số thời gian là * thì có nghĩa là tác vụ của bạn sẽ chạy từng phút.
* * * * * /bin/execute/this/script.sh
Bất kì trường thời gian nào nếu bạn để là * thì có nghĩa trường đó sẽ chạy every ~(Every minute, every day …)
Ví dụ: Chạy script 30 phút 1 lần
0,30 * * * * /bin/execute/this/script.sh
– Chạy script 15 phút 1 lần:
0,15,30,45 * * * * /bin/execute/this/script.sh Hoặc bạn có thể viết ngắn gọn như sau(Con đường nào cũng ra Hà Nội thui nên nếu bạn không biết viết lệnh crobtab ngắn gọn thì cứ sách vở mà triển khai) */15 * * * * /bin/execute/this/script.sh
– Chạy script vào 3 giờ sáng mỗi ngày:
0 3 * * * /bin/execute/this/script.sh
Nếu bạn cảm thấy nhớ mấy quy tắc này nó rườm rà, phức tạp thì có thể sử dụng tool để nó tự động gen cho bạn. Việc của bạn là copy nó vào crontab là xong.
Công cụ gen crontab tự động: Crontab Generator
Một số lệnh crontab phổ biến
Bạn có thể sử dụng các từ khóa đặc biệt để thay cho thời gian cụ thể như sau:
@reboot Run once, at startup @yearly Run once a year "0 0 1 1 *" @annually (same as @yearly) @monthly Run once a month "0 0 1 * *" @weekly Run once a week "0 0 * * 0" @daily Run once a day "0 0 * * *" @midnight (same as @daily) @hourly Run once an hour "0 * * * *"
Ví dụ: thực hiện script.sh hàng ngày vào lúc 0 giờ, 0 phút.
@daily /bin/execute/this/script.sh
#Tắt tính năng gửi mail mỗi khi chạy crontab
Mặc định cron gửi email cho quản trị viên mỗi khi 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>&1 Ví dụ: 0 15 * * 1,4 sh /etc/script.sh >/dev/null 2>&1
#Tạo log file
Nhiều khi bạn muốn lưu lại log để khi kiểm tra xem việc crontab chạy có đúng ý hay không. Để lưu log vào file bạn làm như sau:
@daily /bin/execute/this/script.sh > /home/username/cronlogs/script_output.log
#Tạm kết
Như vậy là mình đã hoàn thành bài viết tổng hợp những kiến thức cơ bản về sử dụng crontab trong linux. Giờ thì bạn đã biết crontab là gì, cơ chế hoạt động của crontab, cũng như cách sử dụng crontab…
Mình hi vọng bài viết này có ích với bạn, đặc biệt là các bạn quản trị server, admin của website.
Tiếp tục ủng hộ mình nhé, hãy share bài viết nếu thích 🙂
Bình luận. Cùng nhau thảo luận nhé!