Nếu bạn muốn lên lịch cho một công việc Linux chỉ diễn ra một lần, cron
là quá mức cần thiết. Các at
họ lệnh là những gì bạn cần! Và nếu bạn chỉ muốn chạy các quy trình khi hệ thống của bạn có tài nguyên miễn phí, bạn có thể sử dụng batch
.
Cách lên lịch công việc trên Linux
Các cron
daemon duy trì một danh sách các công việc mà nó chạy vào những thời điểm cụ thể. Các tác vụ và chương trình này chạy ở chế độ nền vào các thời điểm đã lên lịch. Điều này cung cấp cho bạn sự linh hoạt tuyệt vời để lập lịch các tác vụ cần được lặp lại. Cho dù bạn cần chạy một tác vụ mỗi giờ một lần, vào một thời điểm cụ thể mỗi ngày hay một lần một tháng hoặc một năm, bạn có thể thiết lập nó trong cron
.
Tuy nhiên, điều này không hữu ích nếu bạn muốn lên lịch cho một tác vụ chỉ chạy một lần. Chắc chắn, bạn có thể thiết lập nó trong cron
, nhưng sau đó bạn phải nhớ quay lại và xóa mục crontab sau khi tác vụ thực thi, điều này thật bất tiện.
Với Linux, nếu bạn đang gặp khó khăn với một vấn đề, đó gần như là một sự đảm bảo rằng ai đó cũng đã phải vật lộn với nó. May mắn thay, bởi vì các hệ điều hành giống Unix đã tồn tại quá lâu, nên cũng có khả năng cao là ai đó đã tạo ra giải pháp cho vấn đề của bạn.
Đối với vấn đề được nêu ở trên, họ có, và nó được gọi là at
.
LIÊN QUAN: Cách lập lịch tác vụ trên Linux: Giới thiệu về tệp Crontab
Cài đặt tại Command
Chúng tôi đã phải cài đặt at
trên Ubuntu 18.04 và Manjaro 18.1.0 (nó đã được cài đặt trên Fedora 31).
Để cài đặt at
trên Ubuntu, sử dụng lệnh này:
sudo apt-get install at
Sau khi cài đặt hoàn tất, bạn có thể bắt đầu at
daemon với lệnh này:
sudo systemctl enable --now atd.service
Trên Manjaro, bạn cài đặt at
với lệnh này:
sudo pacman -Sy at
Sau khi cài đặt hoàn tất, hãy nhập lệnh này để bắt đầu at
daemon:
sudo systemctl enable --now atd.service
Trên bất kỳ bản phân phối nào, bạn có thể nhập lệnh này để đảm bảo atd
daemon đang chạy:
ps -e | grep atd
Cách sử dụng at Command tương tác
Để sử dụng at
, bạn phải ấn định ngày và giờ để chạy. Có rất nhiều sự linh hoạt trong cách bạn có thể viết những điều này, mà chúng tôi sẽ đề cập ở phần sau của bài viết này.
Tuy nhiên, mặc dù chúng tôi sẽ sử dụng at
tương tác, bạn phải cung cấp ngày và giờ trước. Nếu bạn không bao gồm bất kỳ điều gì trên dòng lệnh hoặc bạn nhập nội dung nào đó không phải là ngày và giờ, at
trả lời bằng “Thời gian bị cắt xén”, như được hiển thị bên dưới:
at
at banana
Ngày và giờ có thể rõ ràng hoặc tương đối. Ví dụ: giả sử bạn muốn lệnh thực thi sau một phút kể từ bây giờ. at
biết “bây giờ” nghĩa là gì, vì vậy bạn có thể sử dụng now
và thêm một phút vào đó, như sau:
at now + 1 minute
at
in ra một tin nhắn và một at
nhắc và đợi bạn nhập các lệnh bạn muốn lập lịch. Tuy nhiên, trước tiên, hãy xem xét thông báo, như hình dưới đây:
Nó nói với bạn at
khởi chạy một phiên bản của sh
shell và sẽ chạy các lệnh bên trong đó. Các lệnh của bạn sẽ không được thực thi trong Bash shell, tương thích với sh
shell nhưng có bộ tính năng phong phú hơn.
Nếu các lệnh hoặc tập lệnh của bạn cố gắng sử dụng một chức năng hoặc tiện ích mà Bash cung cấp, nhưng sh
không, họ sẽ thất bại.
Thật dễ dàng để kiểm tra xem các lệnh hoặc tập lệnh của bạn có chạy trong không sh
. Sử dụng sh
lệnh để bắt đầu một sh
vỏ:
sh
Dấu nhắc lệnh thay đổi thành dấu đô la ($
) và bây giờ bạn có thể chạy các lệnh của mình và xác minh rằng chúng hoạt động chính xác.
Để quay lại trình bao Bash, hãy nhập exit
chỉ huy:
exit
Bạn sẽ không thấy bất kỳ đầu ra tiêu chuẩn hoặc thông báo lỗi nào từ các lệnh. Điều này là bởi vì sh
shell khởi chạy như một tác vụ nền và chạy mà không có bất kỳ loại giao diện màn hình nào.
Bất kỳ đầu ra nào từ các lệnh — tốt hay xấu — đều được gửi qua email cho bạn. Nó được gửi qua hệ thống thư nội bộ cho bất kỳ ai chạy at
chỉ huy. Điều này có nghĩa là bạn phải thiết lập và cấu hình hệ thống email nội bộ đó.
Nhiều (hầu hết) hệ thống Linux không có hệ thống email nội bộ vì hiếm khi cần hệ thống này. Những thứ thường sử dụng một hệ thống như sendmail hoặc postfix. Nếu hệ thống của bạn không có hệ thống email nội bộ, bạn có thể ghi các tập lệnh vào tệp hoặc chuyển hướng đầu ra tới tệp để thêm ghi nhật ký.
Nếu lệnh không tạo ra bất kỳ đầu ra chuẩn hoặc thông báo lỗi nào, bạn sẽ không nhận được email. Nhiều lệnh Linux chỉ ra thành công thông qua sự im lặng, vì vậy trong hầu hết các trường hợp, bạn sẽ không nhận được email.
LIÊN QUAN: Stdin, stdout và stderr trên Linux là gì?
Bây giờ, đã đến lúc nhập lệnh vào at
. Đối với ví dụ này, chúng tôi sẽ sử dụng một tệp kịch bản nhỏ có tên là sweep.sh
điều đó xóa *.bak
, *.tmp
, và *.o
các tập tin. Nhập đường dẫn đến lệnh, như được hiển thị bên dưới, rồi nhấn Enter.
Một dấu nhắc lệnh khác xuất hiện và bạn có thể thêm bao nhiêu lệnh tùy thích. Thông thường sẽ thuận tiện hơn khi có các lệnh của bạn trong một tập lệnh duy nhất và chỉ cần gọi tập lệnh đó từ bên trong at
.
Nhấn Ctrl + D để nói at
bạn đã hoàn tất việc thêm lệnh. at
hiển thị
Sau khi công việc thực hiện, hãy nhập thông tin sau để kiểm tra thư nội bộ của bạn:
Nếu không có thư, bạn phải cho là thành công. Tất nhiên, trong trường hợp này, bạn có thể kiểm tra và xem liệu *.bak
, *.tmp
, và *.o
các tệp đã bị xóa để xác nhận lệnh hoạt động.
Nhập nội dung sau để chạy lại toàn bộ:
at now + 1 minute
Sau một phút, hãy nhập nội dung sau để kiểm tra lại thư của bạn:
Này, chúng tôi có thư! Để đọc tin nhắn số một, hãy nhấn 1, rồi nhấn Enter.
Chúng tôi đã nhận được một email từ at
bởi vì các lệnh trong tập lệnh tạo ra thông báo lỗi. Trong ví dụ này, không có tệp nào để xóa vì khi chúng tôi chạy tập lệnh trước đó, nó đã xóa chúng.
Nhấn D + Enter để xóa email và Q + Enter để thoát khỏi chương trình thư.
Định dạng ngày và giờ
Bạn có rất nhiều sự linh hoạt khi nói đến các định dạng thời gian mà bạn có thể sử dụng at
. Đây là vài ví dụ:
-
Chạy lúc 11:00 sáng:
-
at 11:00 AM
-
-
Chạy lúc 11 giờ sáng mai:
-
at 11:00 AM tomorrow
-
-
Chạy lúc 11:00 sáng ngày này tuần sau:
-
at 11:00 AM next week
-
-
Chạy vào thời điểm này, vào ngày này, tuần sau:
-
at next week
-
-
Chạy lúc 11:00 sáng thứ Sáu tuần sau:
-
at 11:00 AM next fri
-
-
Chạy vào thời điểm này vào thứ Sáu tới:
-
at next fri
-
-
Chạy lúc 11:00 sáng vào ngày này, tháng sau:
-
at 11:00 AM next month
-
-
Chạy lúc 11:00 sáng vào một ngày cụ thể:
-
at 11:00 AM 3/15/2020
-
-
Chạy 30 phút kể từ bây giờ:
-
at now + 30 minutes
-
-
Chạy hai giờ kể từ bây giờ:
-
at now + 2 hours
-
-
Chạy vào thời điểm này vào ngày mai:
-
at tomorrow
-
-
Chạy vào lúc này vào Thứ Năm:
-
at thursday
-
-
Chạy lúc 12:00 sáng:
-
at midnight
-
-
Chạy lúc 12:00 trưa:
-
at noon
-
-
Nếu bạn là người Anh, bạn thậm chí có thể lên lịch để lệnh chạy vào lúc teatime (4 giờ chiều):
-
at teatime
-
Nhìn vào Hàng đợi Việc làm
Bạn có thể gõ atq
lệnh để xem hàng đợi các công việc đã lên lịch, như hình dưới đây.
Đối với mỗi lệnh trong hàng đợi, atq
hiển thị thông tin sau:
- ID công việc
- Lịch hẹn
- Thời gian đã lên lịch
-
Xếp hàng chờ công việc đang ở. Các hàng đợi được gắn nhãn “a,” “b”, v.v. Các công việc bình thường mà bạn lên lịch
at
chuyển sang hàng đợi “a” trong khi các nhiệm vụ bạn lên lịchbatch
(được đề cập ở phần sau của bài viết này) vào hàng đợi “b.” - Người đã lên lịch công việc.
Sử dụng tại trên Dòng lệnh
Bạn không cần phải sử dụng at
tương tác; bạn cũng có thể sử dụng nó trên lệnh. Điều này làm cho việc sử dụng các tập lệnh bên trong dễ dàng hơn.
Bạn có thể chuyển các lệnh vào at
, như thế này:
echo "sh ~/sweep.sh" | at 08:45 AM
Công việc được chấp nhận và lên lịch bởi at
, và số công việc và ngày thực hiện được báo cáo giống như trước đây.
LIÊN QUAN: Cách sử dụng Pipes trên Linux
Sử dụng tại với Tệp lệnh
Bạn cũng có thể lưu trữ một chuỗi lệnh trong một tệp, sau đó chuyển nó đến at
. Đây có thể là một tệp văn bản thuần túy của các lệnh — nó không nhất thiết phải là một tập lệnh thực thi.
Bạn có thể dùng -f
(tệp) theo cách sau để chuyển tên tệp vào at
:
at now + 5 minutes -f clean.txt
Bạn có thể đạt được kết quả tương tự nếu bạn chuyển hướng tệp sang at
:
at now + 5 minutes < clean.txt
Xóa công việc đã lên lịch khỏi hàng đợi
Để xóa công việc đã lên lịch khỏi hàng đợi, bạn có thể sử dụng atrm
chỉ huy. Nếu bạn muốn xem hàng đợi trước tiên để tìm số lượng công việc bạn muốn loại bỏ, bạn có thể sử dụng atq
. Sau đó, sử dụng số công việc đó với atrm
, như hình dưới đây:
atq
atrm 11
atq
Cách xem Chế độ xem chi tiết về Công việc
Như chúng tôi đã đề cập trước đây, bạn có thể lên lịch công việc trong tương lai. Đôi khi, bạn có thể quên những gì một công việc sẽ làm. Các atq
lệnh hiển thị cho bạn các công việc trong hàng đợi, nhưng không hiển thị những gì chúng sẽ làm. Nếu bạn muốn xem một cái nhìn chi tiết về một công việc, bạn có thể sử dụng -c
(con mèo) tùy chọn.
Đầu tiên, chúng tôi sẽ sử dụng atq
để tìm số công việc:
atq
Bây giờ, chúng ta sẽ sử dụng công việc số 13 với -c
Lựa chọn:
at -c 13
Dưới đây là bảng phân tích thông tin chúng tôi nhận được về công việc:
-
Dòng đầu tiên: Điều này cho chúng ta biết các lệnh sẽ chạy trong
sh
vỏ sò. -
Dòng thứ hai: Chúng tôi thấy các lệnh sẽ chạy với cả ID người dùng và ID nhóm là 1000. Đây là các giá trị cho người đã chạy
at
chỉ huy. -
Dòng thứ ba: Người nhận bất kỳ email nào
at
gửi đi. -
Dòng thứ tư: Mặt nạ Người dùng là 22. Đây là mặt nạ được sử dụng để đặt quyền mặc định cho bất kỳ tệp nào được tạo trong
sh
phiên họp. Mặt nạ được trừ đi 666, cho chúng ta 644 (tương đương với bát phân củarw-r--r--
). - Dữ liệu còn lại: Phần lớn là các biến môi trường.
- Kết quả của một bài kiểm tra. Kiểm tra kiểm tra để đảm bảo rằng thư mục thực thi có thể được truy cập. Nếu không thể, lỗi sẽ xuất hiện và quá trình thực hiện công việc bị bỏ dở.
-
Các lệnh được thực hiện. Chúng được liệt kê và nội dung của các tập lệnh được lên lịch sẽ được hiển thị. Lưu ý rằng mặc dù tập lệnh trong ví dụ của chúng tôi ở trên được viết để chạy dưới Bash, nó vẫn sẽ được thực thi trong
sh
vỏ sò.
Lệnh lô
Các batch
lệnh hoạt động tương tự như at
lệnh, nhưng với ba điểm khác biệt đáng kể:
- Bạn chỉ có thể sử dụng
batch
lệnh tương tác. - Thay vì lên lịch công việc để thực hiện tại một thời điểm cụ thể, bạn thêm chúng vào hàng đợi và
batch
lệnh thực thi chúng khi tải trung bình của hệ thống thấp hơn 1,5. - Do những điều trên, bạn không bao giờ chỉ định ngày và giờ với
batch
chỉ huy.
Khi bạn sử dụng batch
lệnh, bạn gọi nó bằng tên mà không có tham số dòng lệnh như sau:
batch
Tiếp theo, thêm nhiệm vụ giống như bạn làm với at
chỉ huy.
Kiểm soát quyền truy cập vào lệnh tại
Các at.allow
và at.deny
kiểm soát tệp ai có thể sử dụng at
họ lệnh. Chúng nằm trong /etc
danh mục. Theo mặc định, chỉ at.deny
tệp tồn tại và nó được tạo khi at
được cài đặt.
Đây là cách chúng hoạt động:
-
at.deny
: Liệt kê các ứng dụng và thực thể không thể sử dụngat
để sắp xếp công việc. -
at.allow
: Danh sách những người có thể sử dụngat
để sắp xếp công việc. Nếuat.allow
tệp không tồn tại,at
chỉ sử dụngat.deny
tập tin.
Theo mặc định, bất kỳ ai cũng có thể sử dụng at
. Nếu bạn muốn hạn chế ai có thể sử dụng nó, hãy sử dụng at.allow
tập tin để liệt kê những người có thể. Điều này dễ dàng hơn so với việc thêm tất cả những người không thể sử dụng at
đến at.deny
tập tin.
Đây là những gì at.deny
tệp trông giống như:
sudo less /etc/at.deny
Tệp liệt kê các thành phần của hệ điều hành không thể sử dụng at
. Nhiều người trong số này bị ngăn chặn làm như vậy vì lý do bảo mật, vì vậy bạn không muốn xóa bất kỳ tệp nào khỏi tệp.
Bây giờ, chúng tôi sẽ chỉnh sửa at.allow
tập tin. Chúng tôi sẽ thêm dave
và mary
, nhưng không ai khác sẽ được phép sử dụng at
.
Đầu tiên, chúng tôi nhập như sau:
sudo gedit /etc/at.allow
Trong trình chỉnh sửa, chúng tôi thêm hai tên, như được hiển thị bên dưới, và sau đó lưu tệp.
Nếu có ai khác cố gắng sử dụng at
, anh ta sẽ được thông báo rằng anh ta không có sự cho phép. Ví dụ: giả sử một người dùng có tên eric
nhập như sau:
at
Anh ta sẽ bị từ chối, như hình dưới đây.
Lần nữa, eric
không có trong at.deny
tập tin. Ngay sau khi bạn đưa bất kỳ ai vào at.allow
tệp, bất kỳ- và mọi người khác bị từ chối cho phép sử dụng at
.
Tuyệt vời cho một lần
Như bạn có thể thấy, cả hai at
và batch
lý tưởng cho các tác vụ bạn chỉ cần chạy một lần. Một lần nữa, như một đánh giá nhanh:
- Khi bạn cần làm điều gì đó không phải là một quy trình thường xuyên, hãy lập lịch trình với
at
. - Nếu bạn chỉ muốn chạy một tác vụ khi tải hệ thống đủ thấp, hãy sử dụng
batch
.