Bắt đầu nhanh (5 phút)
cron tiêu chuẩn là công cụ không thể thiếu của quản trị viên hệ thống (sysadmin), nhưng nó gặp khó khăn trong hai trường hợp cụ thể: các tác vụ chạy một lần và các hệ thống không trực tuyến 24/7. Nếu máy của bạn bị tắt vào đúng lúc một cron job được lập lịch, tác vụ đó đơn giản là sẽ biến mất. at và anacron là giải pháp hoàn hảo để lấp đầy những khoảng trống này.
Đầu tiên, hãy đảm bảo at đã được cài đặt trên hệ thống. Trên Ubuntu hoặc Debian, hãy chạy lệnh:
sudo apt update && sudo apt install at
sudo systemctl enable --now atd
Bạn muốn chạy sao lưu vào lúc 2 giờ sáng đêm nay? Thay vì phải loay hoay với tệp crontab phức tạp, chỉ cần chuyển lệnh trực tiếp qua at:
echo "/home/user/scripts/backup.sh" | at 02:00
Anacron xử lý các tác vụ định kỳ theo cách khác. Nó theo dõi các khoảng thời gian thay vì thời gian thực trên đồng hồ. Nếu laptop của bạn gập lại trong lúc một tác vụ dọn dẹp hàng tuần được lập lịch, anacron sẽ kích hoạt nó 15 phút sau khi bạn mở máy lên. Bạn có thể kiểm tra cấu hình của nó bằng cách chạy lệnh cat /etc/anacrontab.
Tìm hiểu sâu về lập lịch tác vụ trên Linux
Sự chính xác của lệnh ‘at’
Tôi thường xuyên sử dụng at cho các tác vụ theo kiểu “chạy rồi quên” (fire and forget). Nó cực kỳ lý tưởng để khởi động lại máy chủ trong khoảng thời gian bảo trì 15 phút hoặc dọn sạch thư mục tạm thời dung lượng 50GB sau khi di chuyển dữ liệu. Cú pháp của nó vô cùng linh hoạt. Bạn có thể chỉ định thời gian tuyệt đối (at 14:30), thời gian tương đối (at now + 2 hours), hoặc các ngày cụ thể như at 10:00 AM July 25.
Mỗi tác vụ được gửi đi sẽ nhận được một ID duy nhất. Bạn có thể quản lý chúng bằng lệnh atq để liệt kê các tác vụ đang chờ và atrm để hủy chúng. Một bài học xương máu: at sẽ chụp lại các biến môi trường hiện tại của bạn tại thời điểm gửi tác vụ. Tuy nhiên, hãy luôn sử dụng đường dẫn tuyệt đối cho các script và file thực thi để tránh các lỗi liên quan đến đường dẫn.
Giải quyết vấn đề “ngoại tuyến” với anacron
Anacron là công cụ thiết yếu cho máy trạm (workstation) và máy phát triển (dev box) cá nhân. Trong khi một VPS đám mây có thể hoạt động liên tục suốt 300 ngày, laptop của bạn có thể sẽ ngủ vào mỗi đêm. Anacron đảm bảo các tác vụ bảo trì vào nửa đêm của bạn thực sự được thực hiện bằng cách theo dõi các dấu mốc thời gian trong /var/spool/anacron.
Cấu trúc của tệp /etc/anacrontab trông như sau:
# chu kỳ (ngày) | độ trễ (phút) | định danh tác vụ | lệnh
1 5 daily-backup /usr/local/bin/backup.sh
7 15 weekly-cleanup /usr/local/bin/cleanup.sh
Trong cấu hình này, việc sao lưu hàng ngày sẽ chạy 24 giờ một lần. Nếu hệ thống bị tắt, anacron sẽ đợi 5 phút sau khi khởi động trước khi thực hiện script. Việc bắt đầu so le này giúp ngăn hàng tá tác vụ bảo trì làm nghẽn CPU ngay khi bạn vừa đăng nhập.
Trong một dự án gần đây với máy chủ Ubuntu có 4GB RAM, tôi đã chuyển nhiều tác vụ xử lý dữ liệu nặng sang các lệnh at được lập lịch vào lúc 3 giờ sáng. Điều này đã giúp giảm tải CPU từ 90% xuống dưới 20% trong giờ làm việc. Hệ thống vẫn mượt mà cho người dùng và tôi không cần phải quản lý crontab cố định cho các nhu cầu tạm thời.
Sử dụng nâng cao và các mẹo hữu ích
Sử dụng lệnh ‘batch’
Lệnh batch là một công cụ mạnh mẽ nhưng thường bị bỏ qua trong gói at. Nó hoạt động chính xác như at, nhưng có “não”: nó chỉ chạy khi mức tải trung bình (load average) của hệ thống giảm xuống dưới 1.5. Điều này hoàn hảo cho các tác vụ nặng như mã hóa video hoặc biên dịch các kernel lớn mà không ảnh hưởng đến công việc hiện tại của bạn.
batch <<EOF
/usr/bin/process-heavy-data.sh
EOF
Hạn chế quyền truy cập
Bảo mật là yếu tố sống còn trong môi trường nhiều người dùng. Linux sử dụng tệp /etc/at.allow và /etc/at.deny để kiểm soát truy cập. Nếu at.allow tồn tại, chỉ những người dùng có tên trong đó mới có thể lập lịch tác vụ. Tôi khuyên bạn nên sử dụng phương pháp danh sách trắng (whitelist) trên các máy chủ sản xuất (production) để ngăn các lập trình viên ít kinh nghiệm vô tình làm cạn kiệt tài nguyên hệ thống bằng các script đệ quy.
Xử lý đầu ra và lỗi
Theo mặc định, at sẽ cố gắng gửi email chứa stdout và stderr đến tài khoản người dùng cục bộ của bạn. Vì email hệ thống cục bộ hiếm khi được kiểm tra, tôi luôn điều hướng đầu ra vào một tệp log chuyên dụng để việc xử lý sự cố trở nên đơn giản hơn:
echo "/path/to/script.sh >> /var/log/myscript.log 2>&1" | at now + 1 hour
Mẹo thực tế để lập lịch tin cậy
- Bắt buộc dùng đường dẫn tuyệt đối: Đừng chỉ chạy
python script.py. Hãy dùng/usr/bin/python3 /home/user/scripts/script.py. Điều này giúp ngăn chặn 90% các lỗi lập lịch. - Kiểm tra thủ công trước khi tự động hóa: Hãy chạy script của bạn trong shell tiêu chuẩn trước. Nếu nó yêu cầu nhập liệu tương tác (như lời nhắc mật khẩu), nó sẽ thất bại trong âm thầm khi chạy ngầm.
- Log phản ánh mọi thứ: Nếu một tác vụ định kỳ biến mất, hãy kiểm tra
journalctl -u anacron. Bạn cũng có thể ép chạy thử tất cả các tác vụ bằng lệnhsudo anacron -f. - Theo dõi các Job ID: Khi lập lịch nhiều tác vụ
at, hãy ghi lại ID. Việc chạy lệnhatrm 42sẽ nhanh hơn nhiều so với việc cuống cuồng tìm cách dừng script khi bạn nhận ra nó có lỗi. - Đồng bộ đồng hồ hệ thống:
atchỉ chính xác khi đồng hồ của bạn chính xác. Hãy đảm bảo NTP đang hoạt động để việc bảo trì lúc 3 giờ sáng không vô tình chạy vào đúng giờ cao điểm 9 giờ sáng.
Làm chủ at và anacron mang lại cho bạn sự linh hoạt mà cron tiêu chuẩn còn thiếu. Cho dù bạn đang quản lý một máy trạm cá nhân hay một máy chủ có lưu lượng truy cập cao, những công cụ này sẽ đảm bảo các tác vụ của bạn chạy đúng thời điểm — ngay cả khi mất điện.

