Hướng dẫn sử dụng crontab để lập lịch tác vụ trong Linux

1. Mở terminal và đăng nhập với quyền quản trị viên (root). 2. Nhập lệnh sau để chỉnh sửa file crontab:
sudo crontab -e
Trong hầu hết các bản phân phối Linux, chỉ có người dùng root hoặc người dùng có quyền sudo mới có thể chỉnh sửa file crontab hệ thống. Điều này là do file crontab thường nằm trong thư mục hệ thống và việc chỉnh sửa chúng có thể ảnh hưởng đến hoạt động cũng như bảo mật của hệ thống. Nếu bạn muốn chỉnh sửa file crontab hệ thống (áp dụng cho tất cả người dùng), bạn cần sử dụng tài khoản root hoặc tài khoản có quyền sudo để thực thi lệnh `crontab -e`. Tuy nhiên, đối với người dùng thông thường, cũng có file crontab ở cấp người dùng, chỉ có hiệu lực với người dùng đó. Người dùng thông thường có thể sử dụng lệnh `crontab -e` để chỉnh sửa file crontab của mình mà không cần quyền root. Tóm lại, để chỉnh sửa file crontab hệ thống, bạn cần sử dụng root hoặc tài khoản có quyền sudo để thực thi `crontab -e`. Để chỉnh sửa file crontab cấp người dùng, bạn có thể chạy lệnh `crontab -e` với tài khoản thông thường. 3. Nếu đây là lần đầu chỉnh sửa file crontab, hệ thống sẽ yêu cầu bạn chọn editor mặc định. Hãy chọn editor mà bạn quen thuộc, ví dụ vim hoặc nano, và làm theo hướng dẫn. 4. Trong editor, mỗi dòng đại diện cho một tác vụ định thời. Định dạng của mỗi dòng như sau:
# Thực thi vào phút thứ 0, 15, 30, 45 mỗi giờ
0,15,30,45 * * * * /opt/dns_health_check.sh >> /opt/dns_health_check.log 2>&1

# Có thể viết tương đương như sau
*/15 * * * * /opt/dns_health_check.sh >> /opt/dns_health_check.log 2>&1
Trong crontab, các trường để chỉ định thời gian thực thi tác vụ được tạo thành từ năm dấu asterisk, có định dạng `* * * * *`. Mỗi dấu asterisk đại diện cho một đơn vị thời gian, lần lượt là phút, giờ, ngày, tháng và ngày trong tuần. Dưới đây là một số cách biểu diễn thời gian phổ biến:
  1. Chỉ định giá trị cụ thể:
    • `*`: Khớp với mọi giá trị. Ví dụ, `* * * * *` khớp với mỗi phút một lần.
    • `5`: Khớp với giá trị được chỉ định. Ví dụ, `5 * * * *` khớp với phút thứ 5 mỗi giờ.
  2. Chỉ định nhiều giá trị:
    • `1,3,5`: Khớp với nhiều giá trị được chỉ định. Ví dụ, `1,3,5 * * * *` khớp với phút thứ 1, 3 và 5 mỗi giờ.
    • `1-5`: Khớp với các giá trị trong một phạm vi. Ví dụ, `1-5 * * * *` khớp với phút thứ 1 đến 5 mỗi giờ.
  3. Chỉ định khoảng thời gian:
    • `*/5`: Khớp với mỗi giá trị cách một khoảng được chỉ định. Ví dụ, `*/5 * * * *` khớp với mỗi 5 phút một lần.
    • `0-59/5`: Khớp với mỗi giá trị cách một khoảng trong phạm vi được chỉ định. Ví dụ, `0-59/5 * * * *` khớp với mỗi 5 phút một lần.
  4. Kết hợp danh sách và wildcard:
    • `1,3,*/10`: Khớp với các giá trị được chỉ định và mỗi giá trị cách một khoảng. Ví dụ, `1,3,*/10 * * * *` khớp với phút thứ 1, 3 và mỗi 10 phút một lần.
Cần lưu ý rằng các đơn vị thời gian khác nhau có phạm vi giá trị khác nhau: phút từ 0-59, giờ từ 0-23, ngày từ 1-31, tháng từ 1-12, ngày trong tuần từ 0-7 (trong đó 0 và 7 đều đại diện cho Chủ nhật). Bạn có thể kết hợp và điều chỉnh các cách biểu diễn này tùy theo nhu cầu cụ thể. Cuối cùng:
  1. Chỉnh sửa tác vụ hiện có: Để sửa đổi hoặc xóa tác vụ đã tồn tại, trong giao diện editor, tìm tác vụ bạn muốn thay đổi và thực hiện chỉnh sửa tương ứng.
  2. Lưu thay đổi và thoát khỏi editor: Trong giao diện editor, sử dụng các phím tắt phù hợp để lưu thay đổi và thoát.
  3. Kiểm tra tác vụ đã được áp dụng: Sau khi chỉnh sửa, hệ thống sẽ tự động tải lại crontab, bạn có thể sử dụng lệnh `crontab -l` để xem danh sách tác vụ hiện tại và xác nhận thay đổi đã được áp dụng.
  4. Xóa danh sách tác vụ của người dùng hiện tại: Có thể sử dụng lệnh `crontab -r` hoặc `crontab -e` để chỉnh sửa lại.
Phụ lục: Script kiểm tra DNS tự động
#!/bin/bash

# Lấy thời gian hiện tại
Timestamp=$(date +"%Y-%m-%d %H:%M:%S")

# Kiểm tra trạng thái dịch vụ BIND có đang active hay không, nếu không thì khởi động lại
if ! systemctl is-active --quiet named.service; then
    echo -e "\033[1;33m$Timestamp Dịch vụ BIND không hoạt động hoặc có lỗi, đang thử khởi động lại.\033[0m"
    sudo systemctl restart named
    echo "Kết quả phân giải www.sina.com: $(dig www.sina.com +short)"
    exit 1
fi

# Kiểm tra phân giải DNS
targets=("www.baidu.com" "www.qq.com" "www.sina.com")

for target in "${targets[@]}"; do
    query_result=$(dig "$target" +short)
    if [ -z "$query_result" ]; then
        echo -e "\033[1;33m$Timestamp Phân giải DNS cho domain ${target} bất thường!\033[0m"
        echo "Thực hiện khởi động lại DNS..."
        sudo rndc reload
        echo "Thực hiện xóa cache DNS..."
        sudo rndc flush
        echo "Dịch vụ DNS đã được khởi động lại."
        exit 1
    else
        echo "$Timestamp Phân giải DNS bình thường."
        echo "Phân giải ${target}: $(dig ${target} +short)"
    fi
done

Thẻ: linux cron crontab scheduled-tasks system-administration

Đăng vào ngày 26 tháng 6 lúc 20:14