107.2 Bài 2
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
107 Các Tác vụ Quản trị |
Mục tiêu: |
107.2 Tự động hóa các Các Tác vụ Quản trị Hệ thống bằng cách lập lịch trình công việc |
Bài: |
2 trên 2 |
Giới thiệu
Như đã học trong bài học trước, người dùng có thể lâp lịch trình các công việc định kỳ bằng cách sử dụng cron
hoặc bộ hẹn giờ systemd. Tuy nhiên, đôi khi chúng ta sẽ chỉ cần chạy một công việc một lần tại một thời điểm cụ thể trong tương lai. Để thực hiện việc này, ta có thể sử dụng một tiện ích mạnh mẽ khác là lệnh at
.
Lập lịch trình công việc với at
Lệnh at
được sử dụng để lập lịch trình cho các tác vụ chỉ cần thực thi một lần và sẽ chỉ yêu cầu chỉ định thời điểm được chạy trong tương lai. Sau khi nhập at
trên dòng lệnh, theo sau là thông số thời gian, chúng ta sẽ nhập dấu nhắc at
vào nơi các lệnh sẽ được thực thi. Chúng ta có thể thoát khỏi dấu nhắc bằng chuỗi phím Ctrl+D.
$ at now +5 minutes warning: commands will be executed using /bin/sh at> date at> Ctrl+D job 12 at Sat Sep 14 09:15:00 2019
Công việc của at
trong ví dụ trên chỉ là thực thi lệnh date
sau năm phút. Tương tự như cron
, đầu ra tiêu chuẩn và lỗi sẽ được gửi cho người dùng qua e-mail. Hãy lưu ý rằng trình nền atd
sẽ phải chạy trên hệ thống để có thể sử dụng lệnh lập lịch trình công việc at
.
Note
|
Trong Linux, lệnh |
Các tùy chọn quan trọng nhất áp dụng cho lệnh at
là:
-c
-
In các lệnh của một ID công việc cụ thể ra đầu ra tiêu chuẩn.
-d
-
Xóa công việc dựa trên ID công việc. Đây là bí danh của
atrm
. -f
-
Đọc công việc từ một tệp thay vì đầu vào tiêu chuẩn.
-l
-
Liệt kê các công việc đang chờ xử lý của người dùng. Nếu là siêu người dùng, tất cả công việc của tất cả mọi người dùng sẽ được liệt kê. Đây là bí danh của
atq
. -m
-
Gửi thư cho người dùng khi kết thúc công việc ngay cả khi không có đầu ra.
-q
-
Chỉ định một hàng đợi ở dạng một chữ cái từ
a
đếnz
và từA
đếnZ
(theo mặc địnha
choat
vàb
chobatch
). Các công việc trong hàng đợi có chữ cái cao nhất được thực thi với độ chính xác cao hơn. Các công việc được gửi đến hàng đợi có chữ in hoa được coi là công việc củabatch
. -v
-
Hiển thị thời gian công việc sẽ chạy trước khi đọc công việc.
Liệt kê các công việc đã được lập lịch trình với atq
Hãy cùng lên lịch cho hai công việc at
nữa: công việc đầu tiên là thực thi tệp lệnh foo.sh
lúc 09:30 sáng và công việc thứ hai là thực thi tệp lệnh bar.sh
sau một giờ.
$ at 09:30 AM warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 13 at Sat Sep 14 09:30:00 2019 $ at now +2 hours warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 14 at Sat Sep 14 11:10:00 2019
Để liệt kê các công việc đang chờ được xử lý, chúng ta có thể sử dụng lệnh atq
để hiển thị các thông tin sau cho từng công việc: ID công việc, ngày thực hiện công việc, thời gian thực hiện công việc, hàng đợi và tên người dùng.
$ atq 14 Sat Sep 14 11:10:00 2019 a frank 13 Sat Sep 14 09:30:00 2019 a frank 12 Sat Sep 14 09:15:00 2019 a frank
Hãy nhớ rằng lệnh at -l
là bí danh của atq
.
Note
|
Nếu chạy |
Xóa công việc bằng atrm
Nếu muốn xóa một công việc at
, chúng ta có thể sử dụng lệnh atrm
, theo sau là ID công việc. Ví dụ: để xóa công việc có ID 14, ta có thể chạy lệnh sau:
$ atrm 14
Chúng ta có thể xóa nhiều công việc bằng atrm
nếu chỉ định nhiều ID và phân tách chúng bằng dấu cách. Hãy nhớ rằng lệnh at -d
chính là bí danh của atrm
.
Note
|
Nếu chạy |
Định cấu hình Quyền truy cập vào tác vụ lập lịch trình công việc
Việc ủy quyền cho người dùng thông thường lập lịch trình các công việc at
được xác định bởi các tệp /etc/at.allow
và /etc/at.deny
. Nếu /etc/at.allow
tồn tại, chỉ những người dùng không phải siêu người dùng được liệt kê trong đó mới có thể lập lịch trình công việc at
. Nếu /etc/at.allow
không tồn tại nhưng /etc/at.deny
tồn tại, chỉ những người dùng không phải siêu người dùng được liệt kê trong đó mới không thể lên lịch các công việc at
(trong trường hợp này là một tệp /etc/at.deny
trống, tức là mọi người dùng đều được phép lên lịch các công việc at
). Nếu cả hai tệp này đều không tồn tại thì quyền truy cập của người dùng vào tác vụ lập lịch trình công việc at
sẽ phụ thuộc vào bản phân phối được sử dụng.
Thông số thời gian cụ thể
Chúng ta có thể chỉ định thời điểm thực hiện một công việc at
cụ thể bằng cách sử dụng mẫu GG:PP
(Giờ:Phút), theo sau là AM hoặc PM tùy ý trong trường hợp định dạng 12 giờ. Nếu thời gian chỉ định đã trôi qua, hệ thống sẽ tự hiểu rằng thời gian là vào ngày hôm sau. Nếu muốn lên lịch một ngày cụ thể mà công việc sẽ chạy, ta sẽ phải thêm thông tin ngày sau thời gian đó bằng một trong các mẫu sau: tên-tháng ngày-trong-tháng
, tên-tháng ngày-trong-tháng năm
, MMDDYY
, MM/DD/YY
, DD.MM.YY
và YYYY-MM-DD
).
Các từ khóa sau cũng sẽ được chấp nhận: midnight
, noon
, teatime
(4 giờ chiều) và now
, theo sau là dấu cộng (+
) và khoảng thời gian (số phút, giờ, ngày và tuần). Cuối cùng, ta có thể yêu cầu at
thực hiện công việc của hôm nay hoặc ngày mai bằng cách thêm hậu tố thời gian với các từ today
hoặc tomorrow
. Ví dụ: ta có thể sử dụng at 07:15 AM Jan 01
(lúc 07:15 sáng ngày 01 tháng 1) để thực hiện công việc lúc 07:15 sáng ngày 01 tháng 1 và at now +5 minutes
(hiện tại +5 phút) để thực hiện công việc trong 5 phút kể từ thời điểm hiện tại. Chúng ta có thể đọc tệp timespec
trong cây thư mục /usr/share
để biết thêm thông tin định nghĩa chính xác về thông số thời gian.
Một giải pháp thay thế cho at
Bằng việc sử dụng systemd làm trình quản lý hệ thống và dịch vụ, chúng ta cũng có thể lên lịch các tác vụ chạy một lần bằng lệnh systemd-run
. Lệnh này thường được sử dụng để tạo một bộ hẹn giờ nhất thời để lệnh được thực thi tại một thời điểm cụ thể mà không cần phải tạo tệp dịch vụ. Ví dụ: với quyền gốc, người dùng có thể chạy lệnh date
lúc 11:30 sáng ngày 10/10/2019 bằng cách sử dụng lệnh sau:
# systemd-run --on-calendar='2019-10-06 11:30' date
Nếu muốn chạy tệp lệnh foo.sh
nằm trong thư mục làm việc hiện tại, sau hai phút, chúng ta có thể sử dụng:
# systemd-run --on-active="2m" ./foo.sh
Hãy tham khảo các trang hướng dẫn để tìm hiểu tất cả các cách sử dụng của systemd-run
với systemd-run(1)
.
Note
|
Hãy nhớ rằng bộ hẹn giờ sẽ được ghi vào nhật ký systemd và bạn có thể xem lại nhật ký của các đơn vị khác nhau bằng lệnh |
Bài tập Hướng dẫn
-
Đối với mỗi thông số thời gian sau đây, hãy cho biết thông số nào hợp lệ và thông số nào không hợp lệ đối với
at
:at 08:30 AM next week
at midday
at 01-01-2020 07:30 PM
at 21:50 01.01.20
at now +4 days
at 10:15 PM 31/03/2021
at tomorrow 08:30 AM
-
Một khi đã lập lịch trình công việc với
at
, làm thế nào để có thể xem lại các lệnh của nó? -
Bạn có thể sử dụng lệnh nào để xem lại các công việc
at
đang chờ xử lý? Bạn sẽ sử dụng lệnh nào để xóa chúng? -
Với systemd, lệnh nào có thể được dùng thay thế cho
at
?
Bài tập Mở rộng
-
Giả sử bạn đang hoạt động như một người dùng thông thường, hãy tạo một công việc
at
để chạy tệp lệnhfoo.sh
nằm trong thư mục chính của bạn vào lúc 10:30 sáng ngày 31 tháng 10 sắp tới. -
Hãy đăng nhập vào hệ thống với tư cách là một người dùng thông thường khác và tạo một công việc
at
khác để chạy tệp lệnhbar.sh
vào lúc 10:00 sáng ngày mai (giả sử tệp lệnh nằm trong thư mục chính của người dùng). -
Hãy đăng nhập vào hệ thống với tư cách là một người dùng thông thường khác và tạo một công việc
at
khác để chạy tệp lệnhfoobar.sh
chỉ sau 30 phút (giả sử tệp lệnh nằm trong thư mục chính của người dùng). -
Bây giờ, với quyền gốc, hãy chạy lệnh
atq
để xem lại các công việc màat
đã lập lịch trình của tất cả mọi người dùng. Điều gì sẽ xảy ra nếu người dùng thông thường thực hiện lệnh này? -
Với quyền gốc, hãy xóa tất cả các công việc
at
đang chờ được xử lý này bằng một lệnh duy nhất. -
Hãy chạy lệnh
ls -l /usr/bin/at
và kiểm tra các quyền của nó.
Tóm tắt
Trong bài học này, chúng ta đã học về:
-
Sử dụng
at
để chạy các công việc chạy một lần tại một thời điểm cụ thể. -
Quản lý các công việc
at
. -
Định cấu hình quyền truy cập của người dùng vào việc lập lịch trình công việc
at
. -
Sử dụng
systemd-run
thay thế choat
.
Các tệp và lệnh sau đã được thảo luận trong bài học này:
at
-
Thực hiện các lệnh tại một thời điểm nhất định.
atq
-
Liệt kê các công việc
at
đang chờ xử lý của người dùng (trừ khi người dùng là siêu người dùng). atrm
-
Xóa các công việc
at
bằng mã số công việc của chúng. /etc/at.allow
và/etc/at.deny
-
Các tệp cụ thể được sử dụng để đặt giới hạn
at
. systemd-run
-
Tạo và khởi động một đơn vị
timer
nhất thời thay thế choat
để lập lịch trình chạy một lần.
Đáp án Bài tập Hướng dẫn
-
Đối với mỗi thông số thời gian sau đây, hãy cho biết thông số nào hợp lệ và thông số nào không hợp lệ đối với
at
:at 08:30 AM next week
Hợp lệ
at midday
Không hợp lệ
at 01-01-2020 07:30 PM
Không hợp lệ
at 21:50 01.01.20
Hợp lệ
at now +4 days
Hợp lệ
at 10:15 PM 31/03/2021
Không hợp lệ
at tomorrow 08:30 AM monotonic
Không hợp lệ
-
Một khi đã lập lịch trình công việc với
at
, làm thế nào để có thể xem lại các lệnh của nó?Bạn có thể sử dụng lệnh
at -c
, theo sau là ID của công việc có lệnh bạn muốn xem lại. Hãy lưu ý rằng đầu ra cũng sẽ chứa hầu hết phần môi trường đang hoạt động tại thời điểm công việc được lên lịch. Hãy nhớ rằng siêu người dùng có thể xem lại công việc của mọi người dùng. -
Bạn có thể sử dụng lệnh nào để xem lại các công việc
at
đang chờ xử lý? Bạn sẽ sử dụng lệnh nào để xóa chúng?Bạn có thể sử dụng lệnh
at -l
để xem lại các công việc đang chờ được xử lý và lệnhat -d
để xóa công việc của mình.at -l
là bí danh củaatq
vàat -d
là bí danh củaatrm
. Hãy nhớ rằng siêu người dùng có thể liệt kê và xóa công việc của tất cả mọi người dùng. -
Với systemd, lệnh nào có thể được dùng thay thế cho
at
?Lệnh
systemd-run
có thể được sử dụng thay thế choat
để lên lịch các công việc chạy một lần. Ví dụ: bạn có thể sử dụng nó để chạy các lệnh tại một thời điểm cụ thể, xác định bộ hẹn giờ lịch hoặc bộ hẹn giờ đơn điệu liên quan đến các điểm bắt đầu khác nhau.
Đáp án Bài tập Mở rộng
-
Giả sử bạn đang hoạt động như một người dùng thông thường, hãy tạo một công việc
at
để chạy tệp lệnhfoo.sh
nằm trong thư mục chính của bạn vào lúc 10:30 sáng ngày 31 tháng 10 sắp tới.$ at 10:30 AM October 31 warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 50 at Thu Oct 31 10:30:00 2019
-
Hãy đăng nhập vào hệ thống với tư cách là một người dùng thông thường khác và tạo một công việc
at
khác để chạy tệp lệnhbar.sh
vào lúc 10:00 sáng ngày mai (giả sử tệp lệnh nằm trong thư mục chính của người dùng).$ at 10:00 AM tomorrow warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 51 at Sun Oct 6 10:00:00 2019
-
Hãy đăng nhập vào hệ thống với tư cách là một người dùng thông thường khác và tạo một công việc
at
khác để chạy tệp lệnhbar.sh
vào lúc 10:00 sáng ngày maiiả (g sử tệp lệnh nằm trong thư mục chính của người dùng).$ at now +30 minutes warning: commands will be executed using /bin/sh at> ./foobar.sh at> Ctrl+D job 52 at Sat Oct 5 10:19:00 2019
-
Bây giờ, với quyền gốc, hãy chạy lệnh
atq
để xem lại các công việc màat
đã lập lịch trình của tất cả mọi người dùng. Điều gì sẽ xảy ra nếu người dùng thông thường thực hiện lệnh này?# atq 52 Sat Oct 5 10:19:00 2019 a dave 50 Thu Oct 31 10:30:00 2019 a frank 51 Sun Oct 6 10:00:00 2019 a emma
Nếu chạy lệnh
atq
với quyền gốc, tất cả các công việcat
đang chờ được xử lý của tất cả mọi người dùng sẽ được liệt kê. Nếu chạy nó như một người dùng thông thường thì chỉ các công việcat
đang chờ được xử lý của người dùng đó mới được liệt kê. -
Với quyền gốc, hãy xóa tất cả các công việc
at
đang chờ được xử lý này bằng một lệnh duy nhất.# atrm 50 51 52
-
Hãy thực hiện lệnh
ls -l /usr/bin/crontab
. Bit đặc biệt nào sẽ được thiết lập và ý nghĩa của nó là gì?# ls -l /usr/bin/at -rwsr-sr-x 1 daemon daemon 43762 Dec 1 2015 /usr/bin/at
Trong bản phân phối này, lệnh
at
có cả tập bit SUID (ký tựs
thay vì cờ thực thi cho chủ sở hữu) và SGID (ký tựs
thay vì cờ thực thi cho nhóm), có nghĩa là nó được thực thi với các đặc quyền của chủ sở hữu và nhóm của tệp (daemon
cho cả hai). Đây là lý do tại sao người dùng thông thường có thể lập lịch trình công việc bằngat
.