Yêu cầu để có thể Sử Dụng Cron Để Tự Động Hóa Tác Vụ Trên Linux
- Một hệ thống chạy Linux như CentOS, Ubuntu hoặc Debian.
- Một tài khoản người dùng có quyền root hoặc sudo.
Cron là gì?
Lệnh cron là một tiện ích dòng lệnh tích hợp sẵn trong các hệ điều hành tương tự Unix như Linux, được sử dụng để chạy các tiến trình như lệnh, script, v.v… theo lịch định sẵn. Bạn có thể lên lịch cho các tác vụ như bảo trì hệ thống, tự động sao lưu, hoặc các tác vụ lặp đi lặp lại như tải xuống tệp tin, gửi email, chạy web scraper, v.v… bằng cách sử dụng cron.
Dịch vụ nền đảm nhiệm chức năng của cron là crond daemon. Các hành động của cron được định nghĩa qua các tệp crontab, đây là các tệp cấu hình đặc biệt chỉ định các lệnh shell sẽ được chạy theo lịch trình nhất định.
Dịch vụ cron sẽ quét các tệp crontab trong các thư mục sau:
- /var/spool/cron/crontabs
Các tệp trong thư mục này không nên được truy cập trực tiếp, thay vào đó, hãy sử dụng lệnh crontab để truy cập và cập nhật chúng. - /etc/cron.d
Các dịch vụ hệ thống và ứng dụng thường thêm các tệp cron job (crontab) vào thư mục này. - /etc/crontab
Tệp này phải thuộc sở hữu của người dùng root và không được phép ghi đè bởi nhóm hoặc người dùng khác.
Cron thức dậy mỗi phút để kiểm tra tất cả các tệp crontab được lưu trữ, kiểm tra từng lệnh để xem có nên chạy vào phút hiện tại hay không. Nó cũng kiểm tra mỗi phút xem thời gian chỉnh sửa (modtime) của thư mục spool có thay đổi không, nếu có, cron sẽ kiểm tra lại thời gian chỉnh sửa của tất cả các tệp crontab và nạp lại những tệp nào đã thay đổi, giúp loại bỏ nhu cầu phải khởi động lại dịch vụ cron mỗi khi tệp crontab được sửa đổi.
Mỗi người dùng có thể có tệp crontab riêng của mình.
Cấu trúc của tệp Crontab
Cron sử dụng định dạng đặc biệt để đọc các dòng từ các tệp cấu hình crontab trước khi thực thi lệnh.
# ┌───────────── minute (0 - 59) # │ ┌───────────── hour (0 - 23) # │ │ ┌───────────── day of the month (1 - 31) # │ │ │ ┌───────────── month (1 - 12) # │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday; # │ │ │ │ │ 7 is also Sunday on some systems) # │ │ │ │ │ # │ │ │ │ │ # * * * * * <command to execute>
Mỗi dòng theo định dạng trên đại diện cho một cron job:
30 17 7 * * /home/user/myscript/do_something.sh
Thêm dòng trên vào tệp crontab sẽ lên lịch chạy script do_something.sh vào lúc 17:30 (tức 5:30 chiều) vào ngày 7 của mỗi tháng, bất kể ngày nào.
Mỗi trường trong định dạng này phải được phân cách bằng một khoảng trắng.
Lưu ý: dấu hoa thị (*) là ký tự đại diện cho mọi giá trị cho phép. Bạn cũng có thể chỉ định một phạm vi giá trị bằng cách sử dụng dấu gạch ngang, hoặc nhiều giá trị khác nhau bằng cách phân cách bằng dấu phẩy.
Bạn có thể thiết lập môi trường mặc định bằng cách sử dụng các biến sau:
- SHELL – chỉ định shell sẽ được sử dụng.
- MAILTO – đặt địa chỉ email nơi kết quả của cron job sẽ được gửi đến.
- PATH – đặt đường dẫn cho môi trường.
Lưu ý: bạn nên định nghĩa các biến này ở đầu tệp crontab, ví dụ:
SHELL=/bin/bash MAILTO=test@test.com PATH=/bin:/sbin:/usr/bin:/usr/sbin
Các biến này cần được thiết lập riêng cho từng người dùng vì cron không cung cấp bất kỳ môi trường nào.
Thêm một Cron Job
Để thêm một cron job, bạn cần chỉnh sửa tệp cấu hình crontab của người dùng hiện tại. Để làm điều này, nhập lệnh sau trong cửa sổ terminal:
$ crontab -e
Hoặc để chỉnh sửa crontab cho một người dùng khác (với quyền sudo/root), nhập lệnh:
# crontab -u user_name -e
Một tệp văn bản như sau sẽ được mở ra để bạn chỉnh sửa:
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any'). # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command
Chỉ cần thêm cron job của bạn theo định dạng đã mô tả ở trên vào tệp:
30 17 7 * * /home/user/myscript/do_something.sh
Sau đó lưu và đóng trình soạn thảo. Bạn đã thêm thành công một cron job cho người dùng được chỉ định.
Cron job được thêm theo cách này, theo mặc định, sẽ được lưu dưới thư mục /var/spool/cron/crontabs.
Theo mặc định, cron sẽ gửi email tới địa chỉ mail đã được chỉ định của chủ sở hữu tệp crontab sau khi một cron job chạy xong. Để tắt email thông báo này, hãy thêm chuỗi >/dev/null 2>&1
sau trường lệnh, ví dụ:
* * * * * <command/script-to-execute> >/dev/null 2>&1vv
Một số ví dụ về cron jobs:
Chạy lệnh mỗi ngày vào lúc 3h sáng, 9h sáng và 12h trưa:
0 3,9,12 ** * <command>
Chạy lệnh hàng giờ vào ngày 16 của tháng 12 (Tháng Mười Hai):
0 * 16 12 * <command>
Chạy lệnh 15 phút sau mỗi giờ từ nửa đêm đến 6h sáng, vào mỗi Chủ Nhật:
15 0-6 * * 0 <command>
Cron cũng cho phép sử dụng các chuỗi đặc biệt sau như là cách tắt ngắn gọn:
@reboot - run once, at startup. @yearly - run once a year, same as 0 0 1 1 *”. @annually - same as @yearly. @monthly - run once a month, i.e 0 0 1 * *”. @weekly - run once a week, i.e 0 0 * * 0”. @daily - run once a day, i.e 0 0 * * *”. @midnight - same as @daily. @hourly - run once an hour, i.e 0 * * * *”.
Ví dụ, để chạy một lệnh hàng ngày, chỉ cần sử dụng:
@daily <command-to-execute>
Liệt kê Cron Jobs
Để liệt kê tất cả các cron jobs đang chạy trên hệ thống mà không cần mở tệp cấu hình crontab, chỉ cần nhập lệnh:
$ crontab -l
Hạn chế quyền truy cập Cron
Là một quản trị viên hệ thống, bạn có thể muốn hạn chế người dùng thông thường không được tạo cron job, nhằm tránh việc sử dụng sai mục đích. Để thực hiện điều này, bạn có thể giới hạn quyền truy cập của người dùng bằng cách tạo tệp /etc/cron.d/cron.allow chứa danh sách các người dùng (mỗi tên trên một dòng) được phép tạo cron jobs.
Hoặc thay thế, tạo tệp /etc/cron.d/cron.deny chứa danh sách các người dùng bị từ chối quyền tạo cron jobs (các tên người dùng cũng được phân cách bằng dòng mới).
Để hạn chế người dùng janedoe
và willmark
không được tạo cron jobs, làm theo các bước sau:
- Tạo tệp /etc/cron.d/cron.deny (nếu chưa tồn tại) và mở nó.
- Thêm các dòng sau:
janedoe willmark
- Sau đó, lưu và đóng tệp.
Bạn đã thành công trong việc từ chối quyền tạo cron jobs cho cả hai người dùng janedoe
và willmark.
Lưu ý: người dùng root không thể bị từ chối quyền sử dụng cron theo cách này.
Nếu với tư cách là root, bạn đã từ chối quyền sử dụng cron cho một người dùng nhưng cũng muốn chạy cron job cho người dùng đó, chỉ cần sử dụng sudo/su để đăng nhập với tư cách root và truy cập crontab của bạn với lệnh crontab -e
, sau đó sử dụng định dạng sau để lên lịch công việc cho người dùng khác:
* * * * * <user> <command/script-to-execute>
Ngoài ra, bạn cũng có thể chạy cron jobs cho người dùng khác với định dạng trên khi đang ở chế độ root.
Giới thiệu Anacron
Trong trường hợp hệ thống bị tắt hoặc chuyển sang chế độ ngủ khiến cron bỏ lỡ các cron job đã được lên lịch, các công việc đó sẽ bị bỏ qua vì cron cho rằng hệ thống đang chạy liên tục. Điều này có thể không tối ưu, vì bạn có thể bỏ lỡ các tác vụ quan trọng như sao lưu dữ liệu hoặc email.
Anacron cung cấp chức năng tương tự cron nhưng có khả năng chạy các công việc bị bỏ qua. Lần tiếp theo khi hệ thống khởi động hoàn toàn, anacron sẽ kiểm tra xem các tác vụ đã được cấu hình trước đó có bị bỏ lỡ lịch trình chạy cuối cùng hay không. Nếu có, anacron sẽ chạy ngay các công việc đó, nhưng chỉ chạy một lần bất kể số chu kỳ đã bị bỏ qua. Ví dụ, nếu một công việc được lên lịch chạy hàng ngày nhưng không chạy trong vài ngày do hệ thống bị tắt, anacron sẽ chạy công việc đó một lần khi hệ thống khởi động, bất kể đã bỏ lỡ bao nhiêu ngày.
Anacron đọc danh sách các công việc từ một tệp cấu hình đặc biệt /etc/anacrontab, tệp này chứa danh sách các công việc mà anacron kiểm soát. Mỗi mục công việc chỉ định số ngày, độ trễ tính bằng phút, một định danh công việc duy nhất, và một lệnh shell:
#period delay job-identifier shell-command
- period: chỉ định số ngày kể từ lần chạy cuối cùng của công việc.
- delay: chỉ định thời gian anacron nên đợi trước khi chạy lệnh shell của công việc.
- job-identifier: là tên định danh riêng biệt của công việc khi ghi vào các tệp log.
Sau khi lệnh được thực thi và kết thúc, ngày tháng sẽ được ghi lại vào một tệp timestamp đặc biệt cho công việc đó, giúp anacron biết khi nào cần chạy lại – chỉ có ngày được sử dụng cho các tính toán, không tính giờ.
Thêm công việc vào Anacron
Khác với cron vốn được tích hợp sẵn, anacron cần phải được cài đặt. Đối với các hệ thống Ubuntu và Debian, chỉ cần chạy lệnh sau với quyền sudo/root
để cài đặt:
# apt-get update && apt-get install anacron
Để thêm các công việc vào anacron, mở tệp cấu hình /etc/anacrontab. Tệp này sẽ có dạng như sau:
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/root LOGNAME=root #Start of job entries #These replace cron’s entries 1 5 cron.daily run-parts --report /etc/cron.daily 7 10 cron.weekly run-parts --report /etc/cron.weekly @monthly 15 cron.monthly run-parts --report /etc/cron.monthly
Thêm các mục công việc theo định dạng:
# period-in-days delay-in-minutes job-dentifier shell-command
Ví dụ:
30 15 data-backup1 /bin/bash /home/user/myscripts/data-backup.sh
Dòng lệnh trên sẽ chạy script data-backup.sh của bạn ngay khi có thể nếu nó chưa được chạy trong vòng 30 ngày (một tháng) với độ trễ 15 phút trước khi thực thi. Công việc này sẽ được nhận diện bằng định danh data-backup1 trong các tệp log.
Anacron không được thiết kế để chạy các script vào những thời điểm cụ thể, mà thay vào đó, nó chạy các script theo các khoảng thời gian bắt đầu từ một thời điểm nhất định. Bạn có thể cố định khoảng thời gian bằng cách định nghĩa một biến đặc biệt START_HOURS_RANGE trước các mục công việc:
START_HOURS_RANGE=4-23
Điều này sẽ khiến anacron chỉ chạy công việc trong khoảng giờ từ 4h đến 23h (từ 4 giờ sáng đến 11 giờ tối).
Một biến đặc biệt khác là RANDOM_DELAY
, thiết lập độ trễ ngẫu nhiên tối đa được cộng thêm vào độ trễ do người dùng chỉ định của công việc (mặc định là 15).
Anacron cũng hỗ trợ các chuỗi tắt như đã thấy ở cron để chỉ định khoảng thời gian. Mục công việc ở trên có thể được viết lại như sau:
@monthly 15 data-backup1 /bin/bash /home/user/myscripts/data-backup.sh
Các tùy chọn tự động
Anacron cũng cung cấp một số tùy chọn đơn giản để chạy các tác vụ được lên lịch định kỳ. Bạn có thể đơn giản cài đặt các script của mình vào các thư mục sau tùy theo nhu cầu, anacron sẽ lo phần còn lại:
- /etc/cron.hourly – các script ở đây chạy mỗi giờ.
- /etc/cron.daily – chạy mỗi ngày.
- /etc/cron.weekly – chạy mỗi tuần.
- /etc/cron.monthly – chạy mỗi tháng.
Kết luận
Trong hướng dẫn này, bạn đã khám phá cách bộ lập lịch Cron hoạt động, cách tạo và quản lý cron jobs, cũng như cách sử dụng Anacron để lên lịch các tác vụ định kỳ một cách linh hoạt trên hệ thống Linux.