Computer >> Hướng Dẫn Máy Tính >  >> Điện Thoại Thông Minh >> Linux

Cách lên lịch tác vụ chạy một lần trong Linux với lệnh at

Hướng dẫn sử dụng lệnh at để lên lịch chạy tác vụ chỉ một lần tại thời điểm xác định trong tương lai – khác với cron (chạy lặp lại định kỳ).

Kiểm tra và khởi động at daemon (atd)

# ps -ef | grep atd
# Nếu chưa chạy:
# systemctl start atd      # systemd
# /etc/init.d/atd start    # SysVinit cũ

Cú pháp cơ bản

# at -f script.sh -v 18:30
  • -f script.sh: File script/command cần chạy.
  • -v 18:30: Thời gian chạy (giờ:phút).
  • Sau khi chạy xong, lịch trình tự động xóa (chạy một lần).
  • Định dạng thời gian tự nhiên (Natural Language) – Điểm mạnh của at

    # at -f script.sh 10pm tomorrow
    # at -f script.sh 2:50 tuesday
    # at -f script.sh 6:00 july 11
    # at -f script.sh 2:00 next week
    # at -f script.sh now + 2 hours
    # at -f script.sh teatime        # 16:00
    # at -f script.sh noon           # 12:00
    # at -f script.sh midnight       # 00:00

    Nhập lệnh tương tác (không cần file script)

    # at 23:00
    at> /usr/bin/backup.sh
    at> echo "Backup done" | mail -s "Backup" admin@example.com
    at> Ctrl+D (EOT) để kết thúc

    Quản lý hàng đợi at

    LệnhChức năng
    atq hoặc at -lLiệt kê các job đang chờ
    at -c <job_number>Xem nội dung job
    atrm <job_number> hoặc at -d <job_number>Xóa job
    at -q <queue>Sử dụng hàng đợi khác (a-z, A-Z), mặc định 'a'

    So sánh at vs cron

    Đặc điểmatcron
    Tần suấtMột lầnLặp lại định kỳ
    Cú pháp thời gianTự nhiên (tomorrow, 5pm...)Cron expression (phút giờ ngày tháng thứ)
    Phù hợpBackup lần, khởi động script sau giờ hành chính, nhắc nhởBackup hàng ngày, dọn log, đồng bộ định kỳ
    Lưu trữ/var/spool/at//etc/crontab, /etc/cron.d/, /var/spool/cron/

    Kiểm soát truy cập at

    • /etc/at.allow: Chỉ user trong file này được dùng at (ưu tiên cao hơn).
    • /etc/at.deny: User trong file này KHÔNG được dùng at (mặc định thường rỗng → cho phép tất cả).
    • Root luôn được phép.

    Ví dụ thực tế

    # Khởi động lại dịch vụ lúc 02:00 sáng mai (khi ít traffic)
    echo "systemctl restart nginx" | at 02:00 tomorrow
    
    # Gửi nhắc nhở email
    echo "Meeting in 1 hour" | at now + 50 minutes