Trong quản trị hệ thống Linux, việc tự động hóa các tác vụ là một kỹ năng cực kỳ quan trọng giúp tiết kiệm thời gian và giảm thiểu sai sót do con người. Bạn có thể cần chạy một tập lệnh cập nhật vào lúc nửa đêm, gửi một báo cáo vào cuối ngày, hoặc thực hiện một lần sao lưu dữ liệu trước khi tiến hành bảo trì hệ thống. Hầu hết chúng ta đều quen thuộc với cron để lên lịch các công việc lặp đi lặp lại. Nhưng điều gì sẽ xảy ra nếu bạn chỉ cần thực hiện một tác vụ một lần duy nhất tại một thời điểm cụ thể trong tương lai? Đây chính là lúc lệnh at tỏa sáng. Lệnh at là một giải pháp đơn giản, hiệu quả và cực kỳ tiện lợi để giải quyết vấn đề này, cho phép bạn lên lịch cho một công việc chạy một lần mà không cần cấu hình phức tạp. Bài viết này của AZWEB sẽ hướng dẫn bạn từ A-Z về lệnh at, từ cách cài đặt, sử dụng, quản lý tác vụ cho đến các ví dụ thực tế và so sánh với cron.

Cài đặt và kiểm tra lệnh at trên hệ thống
Trước khi có thể sử dụng sức mạnh của lệnh at, bạn cần đảm bảo rằng nó đã được cài đặt và dịch vụ liên quan đang hoạt động trên hệ thống Linux của mình. Hầu hết các bản phân phối hiện đại không cài đặt sẵn at, nhưng việc này rất dễ dàng.
Cách cài đặt lệnh at trên các bản phân phối Linux phổ biến (Ubuntu, CentOS, Fedora)
Tùy thuộc vào bản phân phối Linux bạn đang sử dụng, bạn sẽ dùng trình quản lý gói tương ứng để cài đặt. Quá trình này thường chỉ mất vài giây.
Trên các hệ thống dựa trên Debian/Ubuntu, bạn sử dụng apt:
sudo apt update
sudo apt install at
Lệnh sudo apt update dùng để cập nhật danh sách các gói phần mềm, đảm bảo bạn cài đặt phiên bản mới nhất. Sau đó, sudo apt install at sẽ tiến hành cài đặt gói at.
Trên các hệ thống dựa trên Red Hat như CentOS hoặc Fedora, bạn có thể sử dụng yum (trên các phiên bản cũ hơn) hoặc dnf (trên các phiên bản mới hơn): Đối với CentOS 7 và các phiên bản cũ hơn:
sudo yum install at
Đối với CentOS 8, Fedora và các phiên bản mới hơn:
sudo dnf install at
Sau khi cài đặt xong, điều quan trọng là phải khởi động và kích hoạt dịch vụ nền của at, được gọi là atd (at daemon). Dịch vụ này chạy liên tục trong nền để theo dõi và thực thi các công việc đã được lên lịch.
sudo systemctl start atd
sudo systemctl enable atd
Lệnh start sẽ khởi chạy dịch vụ ngay lập tức, trong khi lệnh enable đảm bảo rằng dịch vụ atd sẽ tự động khởi động mỗi khi hệ thống của bạn boot lại.

Cách kiểm tra xem lệnh at đã được cài đặt và hoạt động hay chưa
Sau khi cài đặt và khởi động dịch vụ, bạn nên kiểm tra lại để chắc chắn mọi thứ đều sẵn sàng. Có hai lệnh đơn giản để thực hiện việc này.
Đầu tiên, bạn có thể kiểm tra phiên bản của at đã được cài đặt bằng lệnh:
at -V
Nếu lệnh này trả về một thông tin phiên bản (ví dụ: at version 3.2.1), điều đó có nghĩa là gói at đã được cài đặt thành công.
Thứ hai và quan trọng hơn, bạn cần kiểm tra trạng thái của dịch vụ atd để đảm bảo nó đang chạy. Sử dụng lệnh systemctl status:
sudo systemctl status atd
Nếu dịch vụ đang hoạt động tốt, bạn sẽ thấy một dòng trạng thái màu xanh lá cây cho biết active (running). Kết quả này khẳng định rằng hệ thống của bạn đã sẵn sàng để nhận và thực thi các tác vụ được lên lịch bằng at. Nếu trạng thái là inactive (dead), bạn cần chạy lại lệnh sudo systemctl start atd.

Hướng dẫn sử dụng lệnh at để lên lịch thực thi tác vụ một lần
Khi đã cài đặt và xác nhận at đang hoạt động, bạn có thể bắt đầu lên lịch cho các công việc của mình. Giao diện của at rất trực quan, cho phép bạn chỉ định thời gian và sau đó nhập các lệnh bạn muốn thực thi.
Cú pháp cơ bản của lệnh at và cách nhập thời gian thực thi
Cú pháp chung của lệnh at là:
at [THỜI GIAN]
Phần [THỜI GIAN] rất linh hoạt và chấp nhận nhiều định dạng khác nhau, giúp bạn dễ dàng chỉ định chính xác thời điểm mong muốn. Dưới đây là một số ví dụ phổ biến:
- Thời gian tương đối: Bạn có thể lên lịch một công việc sau một khoảng thời gian nhất định tính từ thời điểm hiện tại.
- Chạy sau 10 phút:
at now + 10 minutes - Chạy sau 1 giờ:
at now + 1 hour - Chạy sau 2 ngày:
at now + 2 days
- Chạy sau 10 phút:
- Thời gian cụ thể trong ngày: Bạn có thể chỉ định giờ và phút.
- Vào lúc 6 giờ tối:
at 18:00hoặcat 6pm - Vào lúc 7:30 sáng:
at 07:30
- Vào lúc 6 giờ tối:
- Ngày và giờ cụ thể: Kết hợp ngày tháng và thời gian.
- Vào 4 giờ chiều ngày 25 tháng 12 năm 2023:
at 4pm December 25 2023 - Định dạng
MMDDYYhoặcMM/DD/YY:at 10:00 122523
- Vào 4 giờ chiều ngày 25 tháng 12 năm 2023:
- Các từ khóa đặc biệt: at cũng hiểu các từ khóa thông dụng.
- Vào trưa mai:
at noon tomorrow - Vào giờ uống trà (4 giờ chiều):
at teatime - Vào nửa đêm:
at midnight
- Vào trưa mai:
Cách nhập và lưu lệnh cần thực thi trong phiên làm việc at
Sau khi bạn nhập lệnh at với thời gian mong muốn và nhấn Enter, bạn sẽ được đưa vào một dấu nhắc tương tác at>. Tại đây, bạn có thể nhập lần lượt các lệnh bạn muốn thực thi.
Ví dụ, hãy lên lịch để tạo một tệp tin văn bản sau một phút nữa:
- Gõ lệnh
at now + 1 minutevà nhấn Enter. - Màn hình sẽ hiển thị dấu nhắc
at>. - Nhập lệnh bạn muốn thực thi, ví dụ:
echo "Chào bạn, đây là tác vụ được lên lịch bởi AZWEB" > /home/user/test.txt. - Bạn có thể nhập nhiều lệnh, mỗi lệnh trên một dòng.
- Sau khi nhập xong tất cả các lệnh, nhấn tổ hợp phím
Ctrl+Dđể lưu công việc và thoát khỏi dấu nhắcat>.
Hệ thống sẽ hiển thị một thông báo xác nhận rằng công việc đã được tạo, cùng với một mã số định danh (job ID), ví dụ: job 1 at Mon Dec 18 10:30:00 2023. Sau một phút, bạn có thể kiểm tra và sẽ thấy tệp test.txt đã được tạo trong thư mục /home/user với nội dung đã chỉ định.

Quản lý các tác vụ đã lên lịch bằng lệnh at
Sau khi đã lên lịch một hoặc nhiều tác vụ, bạn sẽ cần các công cụ để xem lại danh sách các công việc đang chờ và hủy bỏ chúng nếu cần. at cung cấp hai lệnh đơn giản cho mục đích này: atq và atrm.
Kiểm tra danh sách các tác vụ đã lên lịch bằng atq
Lệnh atq (viết tắt của at queue) cho phép bạn xem tất cả các công việc đang chờ được thực thi bởi người dùng hiện tại. Chỉ cần gõ lệnh sau vào terminal:
atq
Kết quả trả về sẽ là một danh sách, mỗi dòng tương ứng với một công việc, với các thông tin sau:
- Job ID (Mã công việc): Một con số duy nhất để xác định công việc.
- Date and Time (Ngày và giờ): Thời điểm công việc được lên lịch để thực thi.
- Queue (Hàng đợi): Một ký tự cho biết hàng đợi của công việc. Mặc định là
acho các công việc của at. - User (Người dùng): Tên người dùng đã tạo ra công việc.
Ví dụ, kết quả có thể trông như thế này:
11 Tue Dec 19 14:00:00 2023 a azweb
10 Mon Dec 18 23:30:00 2023 a azweb
Điều này cho biết người dùng azweb có hai công việc đang chờ: công việc số 10 sẽ chạy vào 23:30 hôm nay và công việc số 11 sẽ chạy vào 14:00 ngày mai. Bạn cũng có thể sử dụng at -l như một lệnh thay thế cho atq, chúng có chức năng hoàn toàn tương tự.
Hủy bỏ tác vụ đã lên lịch bằng lệnh atrm hoặc at -d
Nếu bạn thay đổi ý định hoặc phát hiện ra một sai sót trong công việc đã lên lịch, bạn có thể dễ dàng hủy bỏ nó. Để làm điều này, bạn cần có Job ID của công việc đó (lấy từ lệnh atq).
Lệnh để hủy một công việc là atrm (viết tắt của at remove). Cú pháp rất đơn giản:
atrm [Job ID]
Ví dụ, để hủy bỏ công việc số 11 từ danh sách ở trên, bạn sẽ chạy lệnh:
atrm 11
Sau khi chạy lệnh này, nếu bạn kiểm tra lại bằng atq, công việc số 11 sẽ không còn trong danh sách nữa. Tương tự như atq và at -l, lệnh atrm cũng có một phương án thay thế là at -d (viết tắt của at delete). Cả hai đều có cùng một chức năng.
at -d 11
Việc quản lý các tác vụ bằng atq và atrm giúp bạn luôn kiểm soát được các hoạt động tự động trên hệ thống của mình một cách minh bạch và an toàn.

Các ví dụ minh họa sử dụng lệnh at trong thực tế
Lý thuyết là quan trọng, nhưng việc thấy lệnh at hoạt động trong các kịch bản thực tế sẽ giúp bạn hiểu rõ hơn về sức mạnh và tính ứng dụng của nó. Dưới đây là một vài ví dụ phổ biến mà bạn có thể áp dụng ngay.
Lên lịch sao lưu dữ liệu một lần
Giả sử bạn sắp thực hiện một nâng cấp quan trọng và muốn tạo một bản sao lưu thư mục dự án của mình vào lúc 2 giờ sáng ngày mai, khi hệ thống ít tải nhất. Bạn có thể sử dụng at để lên lịch cho lệnh tar.
- Gõ lệnh:
at 02:00 tomorrow - Tại dấu nhắc
at>, nhập lệnh sao lưu:tar -czf /backup/project_backup_$(date +%Y%m%d).tar.gz /var/www/myproject - Nhấn
Ctrl+Dđể lưu lại.
Lệnh này sẽ nén toàn bộ thư mục /var/www/myproject vào một file tar.gz trong thư mục /backup. Tên file sẽ chứa ngày tháng hiện tại để dễ dàng nhận biết, ví dụ project_backup_20231219.tar.gz.
Tự động gửi email nhắc nhở
Bạn cần gửi một email nhắc nhở cho chính mình hoặc một đồng nghiệp vào lúc 5 giờ chiều để tổng kết công việc. at có thể kết hợp với lệnh mail để thực hiện việc này.
- Gõ lệnh:
at 5pm - Tại dấu nhắc
at>, nhập lệnh gửi email:echo "Đừng quên gửi báo cáo tổng kết tuần nhé!" | mail -s "Nhắc nhở: Gửi báo cáo" colleague@example.com - Nhấn
Ctrl+D.
Vào đúng 5 giờ chiều, hệ thống sẽ tự động gửi một email với chủ đề “Nhắc nhở: Gửi báo cáo” và nội dung đã soạn đến địa chỉ colleague@example.com. (Lưu ý: Hệ thống của bạn cần được cấu hình để có thể gửi email từ dòng lệnh).
Chạy script dọn dẹp hệ thống tại thời điểm cụ thể
Bạn có một script tên là cleanup.sh dùng để xóa các file tạm, log cũ và dọn dẹp bộ nhớ cache. Bạn muốn chạy nó vào 11 giờ tối nay.
Đầu tiên, hãy đảm bảo script của bạn có quyền thực thi:
chmod +x /path/to/cleanup.sh
Sau đó, lên lịch bằng at:
- Gõ lệnh:
at 23:00 - Tại dấu nhắc
at>, nhập đường dẫn đầy đủ đến script:/path/to/cleanup.sh - Nhấn
Ctrl+D.
Vào đúng 11 giờ tối, script cleanup.sh sẽ được tự động thực thi, giúp hệ thống của bạn luôn sạch sẽ và tối ưu mà không cần sự can thiệp thủ công.

So sánh lệnh at với các công cụ lên lịch tác vụ khác như cron
Trong thế giới Linux là gì, khi nói đến việc lên lịch tác vụ, hai cái tên được nhắc đến nhiều nhất là at và cron. Cả hai đều cực kỳ hữu ích, nhưng chúng phục vụ cho những mục đích khác nhau. Hiểu rõ sự khác biệt giữa chúng sẽ giúp bạn chọn đúng công cụ cho từng công việc.
Điểm chung và khác biệt cơ bản giữa at và cron
Điểm chung:
Cả at và cron đều là các công cụ tự động hóa tác vụ dựa trên thời gian. Chúng đều chạy dưới dạng dịch vụ nền (daemon – atd và crond) để theo dõi và thực thi các lệnh hoặc script đã được lên lịch.
Khác biệt cơ bản:
Sự khác biệt cốt lõi nằm ở tần suất thực hiện công việc:
- Lệnh at: Được thiết kế để thực thi một công việc một lần duy nhất vào một thời điểm cụ thể trong tương lai. Sau khi công việc được thực hiện, nó sẽ bị xóa khỏi hàng đợi.
- cron: Được thiết kế để thực thi các công việc lặp đi lặp lại theo một lịch trình định kỳ. Ví dụ: chạy hàng phút, hàng giờ, hàng ngày, hàng tuần, hoặc hàng tháng.
Hãy tưởng tượng at giống như một lời nhắc nhở trên lịch cho một sự kiện chỉ xảy ra một lần, chẳng hạn như “gọi điện cho khách hàng lúc 3 giờ chiều mai”. Trong khi đó, cron giống như một chiếc đồng hồ báo thức reo vào 6 giờ sáng mỗi ngày.
Khi nào nên sử dụng at, khi nào nên dùng cron
Việc lựa chọn giữa at và cron phụ thuộc hoàn toàn vào nhu cầu của bạn:
Sử dụng at khi bạn cần:
- Chạy một script cập nhật chỉ một lần vào cuối tuần này.
- Tự động tắt máy chủ vào lúc nửa đêm để bảo trì.
- Gửi một thông báo email một lần vào một thời điểm cụ thể.
- Thực thi một tác vụ nặng vào giờ thấp điểm để tránh ảnh hưởng đến hiệu suất hệ thống, nhưng chỉ cần làm một lần.
Sử dụng cron khi bạn cần:
- Thực hiện sao lưu cơ sở dữ liệu hàng đêm.
- Tạo báo cáo thống kê hàng tuần.
- Kiểm tra và xóa các file tạm trong thư mục
/tmphàng giờ. - Gửi bản tin email hàng tháng.
- Đồng bộ hóa dữ liệu với một máy chủ từ xa mỗi 5 phút.
Ưu nhược điểm từng công cụ trong quản lý tác vụ
Lệnh at:
- Ưu điểm: Cú pháp đơn giản, dễ sử dụng cho các tác vụ đơn lẻ. Không cần phải chỉnh sửa file cấu hình phức tạp.
- Nhược điểm: Không thể lên lịch các tác vụ lặp lại. Nếu bạn cần chạy lại cùng một công việc, bạn phải lên lịch lại từ đầu.
Công cụ cron:
- Ưu điểm: Cực kỳ mạnh mẽ và linh hoạt cho các tác vụ định kỳ. Một khi đã thiết lập, nó sẽ chạy mãi mãi theo lịch trình.
- Nhược điểm: Cú pháp của
crontabcó thể hơi khó hiểu cho người mới bắt đầu. Việc chỉnh sửacrontabđòi hỏi sự cẩn thận để tránh lỗi cú pháp.
Tóm lại, at và cron không phải là đối thủ của nhau, mà là hai công cụ bổ sung cho nhau trong bộ công cụ của một quản trị viên hệ thống Linux hiệu quả.

Các vấn đề thường gặp và cách xử lý
Mặc dù lệnh at khá đơn giản, đôi khi bạn vẫn có thể gặp phải một số vấn đề trong quá trình sử dụng. Dưới đây là hai sự cố phổ biến nhất và cách để khắc phục chúng một cách nhanh chóng.
Lệnh at không hoạt động do dịch vụ atd chưa chạy
Đây là nguyên nhân phổ biến nhất khiến các công việc at không được thực thi. Bạn đã lên lịch một công việc, nhưng đến thời điểm đã định, không có gì xảy ra.
Triệu chứng:
- Bạn lên lịch một công việc thành công nhưng nó không bao giờ chạy.
- Lệnh
atqcó thể hiển thị công việc của bạn trong hàng đợi, nhưng nó không được xử lý.
Nguyên nhân:
Dịch vụ nền atd (at daemon), chịu trách nhiệm theo dõi và khởi chạy các công việc at, không hoạt động.
Cách xử lý:
- Kiểm tra trạng thái dịch vụ:
sudo systemctl status atd - Nếu kết quả hiển thị
inactive (dead), bạn cần khởi động dịch vụ:sudo systemctl start atd - Sau khi khởi động, hãy kích hoạt nó để đảm bảo dịch vụ sẽ tự động chạy mỗi khi hệ thống khởi động lại. Điều này giúp bạn không gặp lại vấn đề tương tự trong tương lai.
sudo systemctl enable atd
Bây giờ, dịch vụ atd đã hoạt động, và các công việc bạn đã lên lịch sẽ được thực thi đúng hẹn.
Lỗi phân quyền hoặc không có quyền sử dụng lệnh at
Trong một số môi trường, đặc biệt là các máy chủ có nhiều người dùng, quản trị viên hệ thống có thể hạn chế quyền sử dụng lệnh at vì lý do bảo mật.
Triệu chứng:
Khi bạn cố gắng sử dụng lệnh at, bạn nhận được thông báo lỗi như You do not have permission to use at. hoặc một thông báo tương tự.
Nguyên nhân:
Quyền truy cập vào at được quản lý bởi hai tệp tin trong thư mục /etc:
/etc/at.allow: Nếu tệp này tồn tại, chỉ những người dùng được liệt kê trong tệp này mới có quyền sử dụng at./etc/at.deny: Nếu/etc/at.allowkhông tồn tại nhưng/etc/at.denytồn tại, tất cả người dùng đều có thể sử dụng at, ngoại trừ những người dùng bị liệt kê trong tệp này.
Cách xử lý:
- Bạn cần có quyền
sudohoặc quyềnrootđể thực hiện các thay đổi này. - Kiểm tra sự tồn tại của hai tệp tin trên.
- Nếu
/etc/at.allowtồn tại và tên người dùng của bạn không có trong đó, bạn cần yêu cầu quản trị viên hệ thống thêm tên của bạn vào tệp này. Mỗi tên người dùng được viết trên một dòng riêng. - Nếu
/etc/at.allowkhông tồn tại, hãy kiểm tra/etc/at.deny. Nếu tên người dùng của bạn có trong đó, hãy xóa nó đi (hoặc yêu cầu quản trị viên làm điều đó). - Sau khi chỉnh sửa các tệp này, bạn không cần phải khởi động lại dịch vụ atd. Các thay đổi sẽ có hiệu lực ngay lập tức.
Bằng cách hiểu rõ hai vấn đề phổ biến này, bạn có thể tự tin gỡ rối và đảm bảo lệnh at hoạt động trơn tru trên hệ thống của mình.

Các best practices khi sử dụng lệnh at
Để khai thác tối đa hiệu quả của lệnh at và tránh những sai lầm không đáng có, bạn nên tuân thủ một số nguyên tắc và thói quen tốt. Những thực hành này không chỉ giúp công việc của bạn chạy ổn định mà còn làm cho việc quản lý trở nên dễ dàng hơn.
Luôn kiểm tra dịch vụ atd trước khi lập lịch
Đây là bước cơ bản nhưng lại thường bị bỏ qua. Trước khi bạn dành thời gian để lên lịch cho một tác vụ quan trọng, hãy dành vài giây để chạy lệnh sudo systemctl status atd. Việc này đảm bảo rằng dịch vụ nền đã sẵn sàng để nhận và xử lý công việc của bạn, giúp bạn tránh được tình trạng công việc “lặng lẽ thất bại”.
Viết script rõ ràng, kiểm tra trước khi lên lịch
Thay vì nhập một chuỗi lệnh dài và phức tạp trực tiếp vào dấu nhắc at>, hãy cân nhắc việc đặt chúng vào một tệp script (ví dụ: my_task.sh). Điều này mang lại nhiều lợi ích:
- Dễ đọc và bảo trì: Script giúp bạn tổ chức các lệnh một cách logic.
- Tái sử dụng: Bạn có thể dễ dàng chạy lại script theo cách thủ công hoặc lên lịch lại mà không cần gõ lại toàn bộ lệnh.
- Dễ kiểm tra: Bạn có thể chạy script thủ công trước để đảm bảo nó hoạt động chính xác trước khi lên lịch tự động.
Sau khi đã tạo script, chỉ cần lên lịch thực thi nó bằng at:
at 2am tomorrow
/path/to/my_task.sh
Ctrl+D
Không lạm dụng lệnh at cho các tác vụ định kỳ
Hãy luôn ghi nhớ nguyên tắc cốt lõi: at dành cho tác vụ một lần, cron dành cho tác vụ định kỳ. Nếu bạn thấy mình phải liên tục lên lịch lại cùng một công việc bằng at, đó là dấu hiệu rõ ràng rằng bạn nên chuyển sang sử dụng cron. Sử dụng đúng công cụ cho đúng mục đích sẽ giúp hệ thống của bạn được tổ chức tốt hơn và dễ quản lý hơn trong dài hạn.
Đảm bảo thời gian nhập đúng định dạng và timezone
Lệnh at sử dụng múi giờ (timezone) của hệ thống. Trên các máy chủ hoạt động toàn cầu, điều này rất quan trọng. Hãy chắc chắn rằng bạn biết múi giờ của máy chủ đang được đặt là gì để tránh việc tác vụ chạy sai thời điểm. Bạn có thể kiểm tra múi giờ hệ thống bằng lệnh timedatectl. Khi chỉ định thời gian, hãy sử dụng các định dạng rõ ràng và không gây nhầm lẫn, ví dụ như 14:30 thay vì chỉ 2:30 (có thể là sáng hoặc chiều). Việc sử dụng định dạng 24 giờ thường an toàn hơn để tránh sai sót.

Kết luận
Lệnh at trong Linux là một công cụ đơn giản nhưng vô cùng mạnh mẽ cho bất kỳ ai cần lên lịch thực thi một tác vụ một lần duy nhất. Thay vì phải chờ đợi đến đúng thời điểm để chạy một lệnh thủ công hoặc cấu hình một cron job phức tạp chỉ cho một lần sử dụng, at cung cấp một giải pháp nhanh chóng, thanh lịch và hiệu quả. Qua bài viết này, AZWEB đã cùng bạn khám phá từ cách cài đặt, cú pháp sử dụng, quản lý hàng đợi với atq và atrm, cho đến các ví dụ thực tiễn và so sánh với cron.
Việc nắm vững lệnh at không chỉ giúp bạn tự động hóa công việc tốt hơn mà còn thể hiện sự chuyên nghiệp trong quản trị hệ thống Linux. Nó cho phép bạn lên kế hoạch trước cho các hoạt động như bảo trì, sao lưu, hoặc chạy các script quan trọng vào những thời điểm ít ảnh hưởng nhất đến người dùng. Chúng tôi khuyến khích bạn hãy mở ngay cửa sổ terminal và thực hành các ví dụ đã được nêu trong bài viết. Khi bạn đã quen thuộc với at, bước tiếp theo trên hành trình làm chủ tự động hóa Linux của bạn có thể là tìm hiểu sâu hơn về cron để xử lý các tác vụ lặp lại, tạo nên một bộ kỹ năng quản trị hệ thống toàn diện.