103.5 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
103 Lệnh GNU và Unix |
Mục tiêu: |
103.1 Tạo, theo dõi và chấm dứt các Tiến trình |
Bài: |
1 trên 2 |
Giới thiệu
Mỗi khi chúng ta gọi một lệnh, một hoặc nhiều tiến trình sẽ được bắt đầu. Một quản trị viên hệ thống được đào tạo tốt không chỉ phải biết cách tạo các tiến trình mà còn phải theo dõi và gửi tới chúng các loại tín hiệu khác nhau nếu/khi cần. Trong bài học này, chúng ta sẽ xem xét về việc kiểm soát công việc và cách giám sát các tiến trình.
Kiểm soát Công việc
Công việc là các tiến trình đã được bắt đầu một cách tương tác thông qua cửa sổ dòng lệnh, sau đó chuyển sang chạy ngầm và chưa được thực thi xong. Chúng ta có thể xem các công việc đang hoạt động (và trạng thái của chúng) trong hệ thống Linux của mình bằng cách chạy lệnh jobs
:
$ jobs
Lệnh jobs
ở trên không tạo ra bất kỳ một kết quả nào. Điều này có nghĩa là không có công việc nào hiện đang hoạt động. Hãy cùng tạo một công việc đầu tiên bằng cách chạy một lệnh cần một khoảng thời gian nhất định để có thể hoàn thành (lệnh sleep
với tham số 60
) và — trong khi chạy — hãy nhấn Ctrl+Z:
$ sleep 60 ^Z [1]+ Stopped sleep 60
Việc thực thi lệnh đã bị dừng (hay đúng hơn là bị đình chỉ) và dấu nhắc lệnh đã khả dụng trở lại. Ta có thể tìm kiếm các công việc một lần nữa và sẽ tìm thấy công việc đã bị đình chỉ ngay lập tức:
$ jobs [1]+ Stopped sleep 60
Hãy cùng giải thích đầu ra:
[1]
-
Số này là ID của công việc và có thể được sử dụng — đứng trước ký hiệu phần trăm (
%
) — để thay đổi trạng thái công việc bằng các tiện íchfg
,bg
vàkill
(như sẽ được đề cập ở phần sau). +
-
Dấu cộng cho biết công việc mặc định hiện tại (tức công việc cuối cùng bị đình chỉ hoặc được chuyển thành chạy ngầm). Công việc trước đó được đánh dấu bằng dấu trừ (
-
). Bất kỳ công việc nào trước đó đều sẽ không được gắn cờ. Stopped
-
Mô tả trạng thái công việc.
sleep 60
-
Bản thân lệnh hoặc công việc.
Với tùy chọn -l
, các công việc sẽ hiển thị thêm ID của tiến trình (PID) ngay trước trạng thái:
$ jobs -l [1]+ 1114 Stopped sleep 60
Các tùy chọn có thể còn lại của công việc là:
-n
-
Chỉ liệt kê các tiến trình đã thay đổi trạng thái kể từ thông báo cuối cùng. Các trạng thái có thể bao gồm,
Running
(Đang chạy),Stopped
(Đã dừng),Terminated
(Đã chấm dứt) hoặcDone
(Hoàn thành). -p
-
Liệt kê các ID của tiến trình.
-r
-
Chỉ liệt kê các công việc đang chạy.
-s
-
Chỉ liệt kê các công việc đã dừng (hoặc bị đình chỉ).
Note
|
Hãy nhớ rằng, một công việc sẽ có cả ID công việc và ID tiến trình (PID). |
Đặc tả Công việc
Lệnh jobs
, cũng giống như các tiện ích khác như fg
, bg
và kill
(sẽ được đề cập tới trong phần tiếp theo), đều cần một đặc tả công việc (hoặc jobspec
) để thực hiện một công việc cụ thể. Như chúng ta vừa thấy, đây có thể (và thông thường) là ID công việc đứng trước %
. Tuy nhiên, chúng ta cũng có thể có các đặc tả công việc khác nữa. Hãy cùng xem kỹ các đặc tả này:
%n
-
Công việc có số id là
n
:$ jobs %1 [1]+ Stopped sleep 60
%str
-
Công việc có dòng lệnh bắt đầu bằng
str
:$ jobs %sl [1]+ Stopped sleep 60
%?str
-
Công việc có dòng lệnh có chứa
str
:$ jobs %?le [1]+ Stopped sleep 60
%+
hoặc%%
-
Công việc hiện tại (trong chế độ chạy nền hoặc bị đình chỉ trong danh sách chạy nổi):
$ jobs %+ [1]+ Stopped sleep 60
%-
-
Công việc trước đây (công việc từng là
%+
trước công việc mặc định hiện tại):$ jobs %- [1]+ Stopped sleep 60
Trong trường hợp của chúng ta, vì chỉ có một công việc nên nó vừa là công việc hiện tại vừa là công việc trước đó.
Trạng thái công việc: Đình chỉ, Chạy nổi và Chạy ngầm
Một khi công việc ở chế độ chạy ngầm hoặc đã bị đình chỉ, chúng ta có thể thực hiện bất kỳ điều nào trong số ba điều sau:
-
Đưa nó lên chạy nổi với
fg
:$ fg %1 sleep 60
fg
sẽ chuyển công việc đã chỉ định thành chạy nổi và biến nó thành công việc hiện tại. Bây giờ, chúng ta có thể đợi cho đến khi nó kết thúc và dừng lại bằng Ctrl+Z hoặc chấm dứt bằng Ctrl+C. -
Đưa nó vào chạy ngầm với
bg
:$ bg %1 [1]+ sleep 60 &
Khi chạy ngầm, công việc có thể được đưa trở lại chạy nổi bằng
fg
hoặc bị chấm dứt (xem bên dưới). Hãy lưu ý ký tự (&
) có nghĩa là công việc đã được chuyển thành chạy ngầm. Trên thực tế, ta cũng có thể sử dụng ký tự (&
) để bắt đầu một tiến trình trực tiếp ở chế độ chạy ngầm:$ sleep 100 & [2] 970
Cùng với ID công việc của công việc mới (
[2]
), giờ đây, chúng ta cũng sẽ nhận được cả ID tiến trình của nó (970
). Bây giờ, cả hai công việc đều đang chạy ngầm:$ jobs [1]- Running sleep 60 & [2]+ Running sleep 100 &
Một lát sau, công việc đầu tiên sẽ kết thúc việc thực thi:
$ jobs [1]- Done sleep 60 [2]+ Running sleep 100 &
-
Chấm dứt nó thông qua tín hiệu
SIGTERM
vớikill
:$ kill %2
Để đảm bảo rằng công việc đã bị chấm dứt, hãy chạy lại
jobs
:$ jobs [2]+ Terminated sleep 100
Note
|
Nếu không có công việc nào được chỉ định, |
Công việc tách rời: nohup
Tất cả các công việc mà chúng ta đã thấy trong các phần trước đều được gắn với phiên của người dùng đã gọi chúng. Điều đó có nghĩa là nếu phiên kết thúc, công việc cũng sẽ biến mất. Tuy nhiên, ta có thể tách các công việc khỏi phiên và chạy chúng ngay cả sau khi phiên đã kết thúc. Điều này có thể được thực hiện bằng lệnh nohup
(“no hangup”). Cú pháp của lệnh sẽ như sau:
nohup COMMAND &
Hãy nhớ rằng, &
sẽ chuyển tiến trình sang chạy ngầm và giải phóng cửa sổ dòng lệnh mà chúng ta đang sử dụng.
Hãy cùng tách công việc đang chạy ngầm ping localhost
ra khỏi phiên hiện tại:
$ nohup ping localhost & [1] 1251 $ nohup: ignoring input and appending output to 'nohup.out' ^C
Đầu ra đã hiển thị cho chúng ta thấy ID công việc ([1]
) và PID (1251
), theo sau là một thông báo cho biết về tệp nohup.out
. Đây là tệp mặc định nơi stdout
và stderr
sẽ được lưu. Bây giờ, chúng ta có thể nhấn Ctrl+C để giải phóng dấu nhắc lệnh, đóng phiên, bắt đầu một phiên khác với tên root
và sử dụng tail -f
để kiểm tra xem lệnh có đang chạy không cũng như đầu ra có được ghi vào tệp mặc định hay không:
$ exit logout $ tail -f /home/carol/nohup.out 64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.070 ms 64 bytes from localhost (::1): icmp_seq=4 ttl=64 time=0.068 ms 64 bytes from localhost (::1): icmp_seq=5 ttl=64 time=0.070 ms ^C
Tip
|
Thay vì sử dụng |
Nếu muốn chấm dứt tiến trình, chúng ta sẽ phải chỉ định PID của nó:
# kill 1251
Giám sát Tiến trình
Một tiến trình hoặc tác vụ đều là bản thể của một chương trình đang chạy. Điều này có nghĩa là chúng ta sẽ tạo ra các tiến trình mới mỗi khi nhập lệnh vào cửa sổ dòng lệnh.
Lệnh watch
sẽ thực thi chương trình theo định kỳ (mỗi 2 giây theo mặc định) và sẽ cho phép chúng ta theo dõi những thay đổi ở đầu ra của chương trình theo thời gian. Chẳng hạn, chúng ta có thể giám sát mức trung bình tải thay đổi như thế nào khi có nhiều tiến trình được chạy bằng cách nhập watch uptime
:
Every 2.0s: uptime debian: Tue Aug 20 23:31:27 2019 23:31:27 up 21 min, 1 user, load average: 0.00, 0.00, 0.00
Lệnh sẽ chạy cho đến khi bị gián đoạn. Vì vậy, chúng ta sẽ phải dừng lệnh bằng Ctrl+C. Ta sẽ nhận được hai dòng dưới dạng đầu ra: dòng đầu tiên tương ứng với watch
và cho biết tần suất lệnh sẽ được chạy (Every 2.0s: uptime
), lệnh/chương trình nào cần xem (uptime
) cũng như tên máy chủ và thời gian (debian: Tue Aug 20 23:31:27 2019
). Dòng thứ hai cho thấy thời gian hoạt động và trong đó bao gồm thời gian (23:31:27
), thời gian hệ thống đã hoạt động (up 21 min
), số lượng người dùng đang hoạt động (1 user
) và tải lượng trung bình của hệ thống/ số lượng tiến trình đang thực thi hoặc ở trạng thái chờ trong 1, 5 và 15 phút qua (load average: 0,00, 0,00, 0,00
).
Tương tự, ta có thể kiểm tra việc sử dụng bộ nhớ khi các tiến trình mới được tạo bằng lệnh watch free
:
Every 2.0s: free debian: Tue Aug 20 23:43:37 2019 23:43:37 up 24 min, 1 user, load average: 0.00, 0.00, 0.00 total used free shared buff/cache available Mem: 16274868 493984 14729396 35064 1051488 15462040 Swap: 16777212 0 16777212
Để thay đổi khoảng thời gian cập nhật cho watch
, hãy sử dụng các tùy chọn -n
hoặc --interval
cộng với số giây như dưới đây:
$ watch -n 5 free
Bây giờ, lệnh free
sẽ chạy sau mỗi 5 giây.
Để biết thêm thông tin về các tùy chọn cho uptime
, free
và watch
, hãy tham khảo các trang hướng dẫn của chúng.
Note
|
Thông tin do |
Gửi tín hiệu tới các Tiến trình: kill
Mỗi tiến trình đơn lẻ đều có một mã định danh tiến trình hoặc một PID duy nhất. Cách để tìm ra PID của một tiến trình là sử dụng lệnh pgrep
, theo sau là tên của tiến trình:
$ pgrep sleep 1201
Note
|
Mã định danh tiến trình cũng có thể được biết thông qua lệnh |
Tương tự như pgrep
, lệnh pkill
sẽ chấm dứt một tiến trình dựa trên tên của nó:
$ pkill sleep [1]+ Terminated sleep 60
Để chấm dứt nhiều phiên bản của cùng một tiến trình, ta có thể sử dụng lệnh killall
:
$ sleep 60 & [1] 1246 $ sleep 70 & [2] 1247 $ killall sleep [1]- Terminated sleep 60 [2]+ Terminated sleep 70
Cả pkill
và killall
đều hoạt động giống như kill
ở chỗ chúng sẽ gửi tín hiệu kết thúc tới (các) tiến trình đã chỉ định. Nếu không có tín hiệu nào được cung cấp, tín hiệu mặc định của SIGTERM
sẽ được gửi. Tuy nhiên, kill
sẽ chỉ lấy một công việc hoặc một ID tiến trình làm đối số.
Tín hiệu có thể được chỉ định bởi:
-
Tên:
$ kill -SIGHUP 1247
-
Số:
$ kill -1 1247
-
Tuỳ chọn:
$ kill -s SIGHUP 1247
Để kill
hoạt động theo cách tương tự như pkill
hoặc killall
(và tự lưu các lệnh để tìm ra PID trước), chúng ta có thể sử dụng trình thay thế lệnh:
$ kill -1 $(pgrep sleep)
Như chúng ta đã biết, một cú pháp thay thế sẽ là kill -1 `pgrep sleep`
.
Tip
|
Để có danh sách đầy đủ tất cả các tín hiệu |
top
và ps
Khi nói đến giám sát tiến trình, hai công cụ rất có giá trị là top
và ps
. Trong khi top
tạo ra đầu ra động thì ps
lại tạo đầu ra tĩnh. Trong mọi trường hợp, cả hai đều là những tiện ích tuyệt vời để chúng ta có cái nhìn toàn diện về tất cả các tiến trình trong hệ thống.
Tương tác với top
Để gọi top
, ta chỉ cần gõ top
:
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
top
cho phép người dùng có một số tương tác. Theo mặc định, đầu ra sẽ được sắp xếp theo tỷ lệ phần trăm thời gian CPU được sử dụng bởi mỗi tiến trình theo thứ tự giảm dần. Hành vi này có thể được sửa đổi bằng cách nhấn các phím sau từ bên trong top
:
M
-
Sắp xếp theo số lượng bộ nhớ được sử dụng.
N
-
Sắp xếp theo số ID tiến trình.
T
-
Sắp xếp theo thời gian.
P
-
Sắp xếp theo phần trăm sử dụng CPU.
Tip
|
Để chuyển đổi giữa thứ tự giảm dần/tăng dần, chỉ cần nhấn |
Các tuỳ chọn thú vị khác để tương tác với top
là:
?
hoặch
-
Cần giúp đỡ.
k
-
Chấm dứt một tiến trình.
top
sẽ yêu cầu huỷPID
của tiến trình cũng như yêu cầu gửi tín hiệu (theo mặc định làSIGTERM
hoặc15
). r
-
Thay đổi mức độ ưu tiên của một tiến trình (
renice
).top
sẽ hỏi bạn về giá trịnice
. Các giá trị có thể nằm trong khoảng từ -20 đến 19, nhưng chỉ siêu người dùng (root
) mới có thể đặt giá trị đó thành âm hoặc thấp hơn giá trị hiện tại. u
-
Liệt kê các tiến trình từ một người dùng cụ thể (theo mặc định, các tiến trình từ tất cả mọi người dùng đều sẽ được hiển thị).
c
-
Hiển thị đường dẫn tuyệt đối của chương trình và phân biệt giữa tiến trình dung lượng người dùng và tiến trình dung lượng hạt nhân (trong dấu ngoặc vuông).
V
-
Chế độ xem cây/thứ bậc tiến trình
t
vàm
-
Thay đổi giao diện của các lần đọc CPU và bộ nhớ tương ứng theo chu kỳ bốn giai đoạn: hai lần nhấn đầu tiên hiển thị thanh tiến trình, lần nhấn thứ ba ẩn thanh tiến trình và lần nhấn thứ tư đưa thanh tiến trình trở lại.
W
-
Lưu cài đặt cấu hình vào
~/.toprc
.
Tip
|
Một phiên bản cao cấp và thân thiện hơn với người dùng của |
Giải thích về đầu ra của top
Đầu ra của top
được chia thành hai vùng: vùng tóm tắt và vùng tác vụ.
Vùng tóm tắt trong top
Vùng tóm tắt được tạo thành từ năm hàng trên cùng và sẽ cung cấp cho chúng ta các thông tin sau:
-
top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14
-
thời gian hiện tại (ở định dạng 24 giờ):
11:20:29
-
thời gian hoạt động (thời gian hệ thống đã hoạt động và chạy):
up 2:21
-
số người dùng đăng nhập và tải lượng trung bình của CPU trong 1, 5 và 15 phút gần nhất tương ứng:
load average: 0,11, 0,20, 0,14
-
-
Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
(thông tin về các tiến trình)-
tổng số tiến trình ở chế độ hoạt động:
73 total
-
đang chạy (những tiến trình đang được thực thi):
1 running
-
đang ngủ (những tiến trình đang chờ để tiếp tục thực thi):
72 sleeping
-
đã dừng (bằng tín hiệu kiểm soát công việc):
0 stopped
-
zombie (những tiến trình đã hoàn thành thực thi nhưng vẫn đang đợi tiến trình mẹ xóa chúng khỏi bảng tiến trình):
0 zombie
-
-
%Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
(phần trăm CPU tiêu thụ)-
tiến trình người dùng:
0,0 us
-
tiến trình hệ thống/hạt nhân:
0,4 sy
-
tiến trình được đặt thành giá trị chuẩn — giá trị càng chuẩn, mức độ ưu tiên càng thấp:
0,0 ni
-
không có gì — thời gian CPU nhàn rỗi:
99,7 id
-
các tiến trình chờ thao tác I/O:
0,0 wa
-
tiến trình phục vụ ngắt phần cứng — thiết bị ngoại vi gửi tín hiệu mà bộ xử lý cần lưu ý:
0,0 hi
-
tiến trình phục vụ ngắt phần mềm:
0,0 si
-
các tiến trình phục vụ các tác vụ của máy ảo khác trong môi trường ảo từ đó có thời gian đánh cắp (?):
0,0 st
-
-
KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache
(memory information in kilobytes)-
tổng dung lượng bộ nhớ:
1020332 total
-
bộ nhớ chưa sử dụng:
909492 miễn phí
-
bộ nhớ đang sử dụng:
38796 used
-
bộ nhớ được đệm và lưu vào bộ nhớ đệm để tránh truy cập đĩa quá nhiều:
72044 buff/cache
Hãy lưu ý
total
là tổng của ba giá trị còn lại —free
,used
vàbuff/cache
— (khoảng 1 GB trong trường hợp của chúng ta).
-
-
KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem
(thông tin hoán đổi tính theo kilobyte)-
tổng dung lượng hoán đổi:
1046524 total
-
dung lượng hoán đổi chưa sử dụng:
1046524 miễn phí
-
dung lượng hoán đổi đang sử dụng:
0 used
-
lượng bộ nhớ hoán đổi có thể được phân bổ cho các tiến trình mà không gây ra thêm phiên hoán đổi:
873264 avail Mem
-
Khu vực Nhiệm vụ trong top
: Trường và Cột
Bên dưới vùng tóm tắt có khu vực tác vụ bao gồm một loạt các trường và cột để báo cáo thông tin về các tiến trình đang chạy:
PID
-
Định danh tiến trình.
USER
-
Người dùng đã đưa ra lệnh tạo tiến trình.
PR
-
Ưu tiên của quá trình cho hạt nhân.
NI
-
Giá trị nice của quá trình. Giá trị nice thấp hơn sẽ có mức độ ưu tiên cao hơn.
VIRAT
-
Tổng dung lượng bộ nhớ được sử dụng bởi tiến trình (bao gồm cả Hoán đổi).
RES
-
Bộ nhớ RAM được sử dụng bởi tiến trình.
SHR
-
Bộ nhớ dùng chung của tiến trình với các tiến trình khác.
S
-
Trạng thái của tiến trình. Các giá trị bao gồm:
S
(ngủ gián đoạn — chờ một sự kiện kết thúc),R
(có thể chạy được — đang thực thi hoặc đang xếp hàng chờ được thực thi) hoặcZ
(zombie — các tiến trình con bị kết thúc có cấu trúc dữ liệu chưa được xóa khỏi bảng tiến trình). %CPU
-
Phần trăm CPU được sử dụng bởi tiến trình.
%MEM
-
Tỷ lệ phần trăm RAM được sử dụng bởi tiến trình, tức giá trị
RES
được biểu thị dưới dạng phần trăm. TIME+
-
Tổng thời gian hoạt động của tiến trình.
COMMAND
-
Tên của lệnh/chương trình đã tạo ra tiến trình.
Xem các Tiến trình tĩnh: ps
Như đã nói ở trên, ps
sẽ hiển thị hình ảnh tức thời của các tiến trình. Để xem tất cả các tiến trình với một cửa sổ dòng lệnh (tty), hãy nhập ps a
:
$ ps a PID TTY STAT TIME COMMAND 386 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux 424 tty7 Ssl+ 0:00 /usr/lib/xorg/Xorg :0 -seat seat0 (...) 655 pts/0 Ss 0:00 -bash 1186 pts/0 R+ 0:00 ps a (...)
Lý giải cú pháp và đầu ra của tuỳ chọn ps
Liên quan đến các tùy chọn, ps
có thể chấp nhận ba kiểu khác nhau: BSD, UNIX và GNU. Hãy cùng xem mỗi kiểu này sẽ hoạt động như thế nào khi báo cáo thông tin về một ID tiến trình cụ thể:
- BSD
-
Các tùy chọn không theo sau bất kỳ dấu gạch ngang nào:
$ ps p 811 PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su
- UNIX
-
Các tùy chọn theo sau một dấu gạch ngang:
$ ps -p 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
- GNU
-
Các tùy chọn được theo sau bởi hai dấu gạch ngang:
$ ps --pid 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
Trong cả ba trường hợp, ps
sẽ báo cáo thông tin về tiến trình có PID
là 811
— trong trường hợp này là bash
.
Tương tự, ta có thể sử dụng ps
để tìm kiếm các tiến trình được bắt đầu bởi một người dùng cụ thể:
-
ps U carol
(BSD) -
ps -u carol
(UNIX) -
ps --user carol
(GNU)
Hãy cùng kiểm tra các tiến trình được bắt đầu bởi carol
:
$ ps U carol PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su 898 pts/0 R+ 0:00 ps U carol
Carol đã bắt đầu hai tiến trình: bash
(-su
) và ps
(ps U carol
). Cột STAT
cho chúng ta biết trạng thái của tiến trình (xem bên dưới).
Chúng ta có thể tận dụng tối đa ps
bằng cách kết hợp một số tùy chọn của nó. Một lệnh rất hữu ích (tạo đầu ra tương tự như đầu ra của top
) là ps aux
(kiểu BSD). Trong trường hợp này, các tiến trình từ tất cả các vỏ (không chỉ vỏ hiện tại) sẽ được hiển thị. Ý nghĩa của các khoá chuyển sẽ như sau:
a
-
Hiển thị các tiến trình được đính kèm với
tty
hoặc cửa sổ dòng lệnh. u
-
Hiển thị định dạng hướng về người dùng.
x
-
Hiển thị các tiến trình không được đính kèm với
tty
hoặc cửa sổ dòng lệnh.
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 204504 6780 ? Ss 14:04 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:04 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:04 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 14:04 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_sched] root 8 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 14:04 0:00 [migration/0] (...)
Hãy cùng giải thích các cột:
USER
-
Chủ sở hữu của quá trình.
PID
-
Định danh tiến trình.
%CPU
-
Tỷ lệ CPU được sử dụng.
%MEM
-
Tỷ lệ bộ nhớ vật lý được sử dụng.
VSZ
-
Bộ nhớ ảo của tiến trình tính theo KiB.
RSS
-
Bộ nhớ vật lý không hoán đổi được sử dụng bởi tiến trình trong KiB.
TT
-
Cửa sổ dòng lệnh (
tty
) kiểm soát tiến trình. STAT
-
Mã đại diện cho trạng thái của tiến trình. Ngoài
S
,R
vàZ
(mà chúng ta đã thấy khi mô tả đầu ra củatop
), các giá trị có thể khác bao gồm:D
(ngủ liên tục — thường là chờ I/O) vàT
(dừng — thường là do tín hiệu điều khiển). Một số công cụ sửa đổi bổ sung bao gồm:<
(mức độ ưu tiên cao — không "nice" với các tiến trình khác),N
(mức độ ưu tiên thấp — "nice" với các tiến trình khác) hoặc+
(trong nhóm tiến trình chạy nổi). STARTED
-
Thời gian tiến trình bắt đầu.
TIME
-
Thời gian CPU tích lũy.
COMMAND
-
Lệnh bắt đầu tiến trình.
Bài tập Hướng dẫn
-
oneko
là một chương trình vui nhộn hiển thị một chú mèo đuổi theo con trỏ chuột của bạn. Nếu chưa được cài đặt trong hệ thống, hãy cài đặt nó bằng trình quản lý gói của bản phân phối. Chúng ta sẽ sử dụng nó để hiểu thêm về tác vụ kiểm soát công việc.-
Hãy khởi động chương trình. Làm thế nào để bạn làm được điều này?
-
Hãy di chuyển con trỏ chuột để xem chú mèo đuổi theo nó như thế nào. Sau đó, hãy đình chỉ tiến trình. Làm thế nào để bạn làm được điều này? Đầu ra sẽ là gì?
-
Hãy kiểm tra xem bạn hiện đang có bao nhiêu công việc. Bạn sẽ gõ gì? Đầu ra sẽ là gì?
-
Bây giờ, hãy chuyển nó thành một tiến trình chạy ngầm và chỉ định ID công việc của nó. Đầu ra sẽ là gì? Làm thế nào để bạn có thể biết được công việc đang chạy ngầm?
-
Cuối cùng, hãy kết thúc công việc bằng cách chỉ định ID công việc của nó. Bạn sẽ gõ gì?
-
-
Hãy khám phá PID của tất cả các tiến trình do máy chủ web Apache HTTPD (
apache2
) tạo ra bằng hai lệnh khác nhau. -
Hãy chấm dứt tất cả các tiến trình
apache2
mà không sử dụng PID của chúng bằng hai lệnh khác nhau. -
Giả sử bạn phải chấm dứt tất cả các bản thể của
apache2
và bạn không có thời gian để tìm hiểu xem PID của chúng là gì. Bạn sẽ thực hiện điều đó như thế nào bằng cách sử dụngkill
với tín hiệuSIGTERM
mặc định trong một dòng mã? -
Hãy bắt đầu
top
và tương tác với nó bằng cách thực hiện như sau:-
Hiển thị chế độ xem cây tiến trình.
-
Hiển thị đường dẫn đầy đủ của các tiến trình phân biệt giữa dung lượng người dùng và dung lượng hạt nhân.
-
-
Hãy nhập lệnh
ps
để hiển thị tất cả các tiến trình được bắt đầu bởi người dùng Apache HTTPD web server (www-data
):-
Sử dụng cú pháp BSD:
-
Sử dụng cú pháp UNIX:
-
Sử dụng cú pháp GNU:
-
Bài tập Mở rộng
-
Tín hiệu
SIGHUP
có thể được sử dụng như một cách để khởi động lại một số trình nền nhất định. Với máy chủ web Apache HTTPD — ví dụ — việc gửiSIGHUP
tới tiến trình mẹ (tiến trình được bắt đầu bởiinit
) sẽ chấm dứt tiến trình con của nó. Tuy nhiên, tiến trình mẹ sẽ đọc lại các tệp cấu hình của nó, mở lại các tệp nhật ký và tạo ra một nhóm con mới. Hãy hực hiện các tác vụ sau:-
Khởi động máy chủ web.
-
Đảm bảo rằng bạn biết PID của tiến trình mẹ.
-
Làm cho máy chủ web Apache HTTPD khởi động lại bằng cách gửi tín hiệu
SIGHUP
tới tiến trình mẹ. -
Kiểm tra và đảm bảo rằng tiến trình mẹ không bị chấm dứt và những tiến trình con mới đã được tạo ra:
-
-
Mặc dù ban đầu là tĩnh nhưng đầu ra của
ps
có thể biến thành động bằng cách kết hợpps
vàwatch
. Chúng ta sẽ giám sát máy chủ web Apache HTTPD cho các kết nối mới. Trước khi thực hiện các tác vụ được mô tả bên dưới, bạn nên đọc mô tả về chỉ thịMaxConnectionsPerChild
trong Chỉ thị chung về MPM của Apache.-
Hãy thêm chỉ thị
MaxConnectionsPerChild
với giá trị1
trong tệp cấu hình củaapache2
— trong Debian và các dẫn xuất tại/etc/apache2/apache2.conf
; trong họ CentOS là tại`/etc/httpd/conf/httpd.conf`. Đừng quên khởi động lạiapache2
để các thay đổi có hiệu lực. -
Hãy nhập lệnh sử dụng
watch
,ps
vàgrep
cho các kết nốiapache2
. -
Bây giờ, hãy mở trình duyệt web hoặc sử dụng trình duyệt dòng lệnh (chẳng hạn như
lynx
) để thiết lập kết nối với máy chủ web thông qua địa chỉ IP của nó. Bạn sẽ thấy gì trong đầu ra củawatch
?
-
-
Như chúng ta đã biết, theo mặc định,
top
sẽ sắp xếp các tác vụ dựa vào phần trăm mức sử dụng CPU theo thứ tự giảm dần (giá trị cao hơn ở trên cùng). Hành vi này có thể được sửa đổi bằng các phím tương tácM
(mức sử dụng bộ nhớ),N
(mã định danh duy nhất của tiến trình),T
(thời gian chạy) vàP
(phần trăm thời gian của CPU). Tuy nhiên, bạn cũng có thể sắp xếp danh sách tác vụ theo ý thích của mình bằng cách khởi chạytop
với khóa chuyển-o
(để biết thêm thông tin, hãy xem trang hướng dẫn của top). Bây giờ, hãy thực hiện các tác vụ sau:-
Khởi chạy
top
để các tác vụ được sắp xếp theo mức sử dụng bộ nhớ: -
Xác minh rằng bạn đã gõ đúng lệnh bằng cách đánh dấu nổi cột bộ nhớ:
-
-
ps
cũng có một khoá chuyểno
để chỉ định các cột bạn muốn hiển thị. Hãy kiểm tra tùy chọn này và thực hiện các tác vụ sau:-
Khởi chạy
ps
để chỉ hiển thị thông tin về người dùng, phần trăm bộ nhớ đã sử dụng, phần trăm thời gian CPU đã sử dụng và lệnh đầy đủ: -
Bây giờ, hãy khởi chạy
ps
để thông tin duy nhất được hiển thị là thông tin về người dùng và tên của chương trình họ đang sử dụng:
-
Tóm tắt
Trong bài học này, chúng ta đã học về công việc và kiểm soát công việc. Các định nghĩa và khái niệm quan trọng cần ghi nhớ là:
-
Công việc là các tiến trình được chạy ngầm.
-
Ngoài ID tiến trình, các công việc cũng được chỉ định ID công việc khi được tạo.
-
Để kiểm soát công việc, ta cần có đặc tả công việc (
jobspec
). -
Công việc có thể được đưa lên chạy nổi, chạy ngầm, đình chỉ và chấm dứt (hoặc kết thúc).
-
Một công việc có thể được tách ra khỏi cửa sổ dòng lệnh và phiên mà nó được tạo.
Tương tự như vậy, chúng ta cũng đã thảo luận về khái niệm của tiến trình và giám sát tiến trình. Các ý quan trọng nhất là:
-
Các tiến trình đang chạy chương trình.
-
Các tiến trình có thể được giám sát.
-
Các tiện ích khác nhau cho phép ta tìm ra ID tiến trình của các tiến trình cũng như gửi cho chúng các tín hiệu để chấm dứt.
-
Tín hiệu có thể được chỉ định theo tên (ví dụ:
-SIGTERM
), số (ví dụ:-15
) hoặc tùy chọn (ví dụ:-s SIGTERM
). -
top
vàps
rất hiệu quả trong quá trình giám sát. Đầu ra củatop
là đầu ra động và liên tục cập nhật; đầu ra củaps
lại là đầu ra tĩnh.
Các lệnh đã được dùng trong bài học:
jobs
-
Hiển thị các công việc đang hoạt động và trạng thái của chúng.
sleep
-
Trì hoãn trong một khoảng thời gian cụ thể.
fg
-
Đưa công việc lên chạy nổi.
bg
-
Đưa công việc xuống thành chạy ngầm.
kill
-
Chấm dứt công việc.
nohup
-
Tách công việc khỏi phiên/cửa sổ dòng lệnh.
exit
-
Thoát vỏ hiện tại.
tail
-
Hiển thị các dòng gần đây nhất trong một tệp.
watch
-
Chạy lặp lại một lệnh (chu kỳ 2 giây theo mặc định).
uptime
-
Hiển thị thời gian hệ thống đã chạy, số lượng người dùng hiện tại và mức tải lượng trung bình của hệ thống.
free
-
Hiển thị tình trạng sử dụng bộ nhớ.
pgrep
-
Tra cứu ID tiến trình dựa trên tên.
pidof
-
Tra cứu ID tiến trình dựa trên tên.
pkill
-
Gửi tín hiệu để xử lý theo tên.
killall
-
Kết thúc (các) tiến trình theo tên.
top
-
Hiển thị các tiến trình Linux.
ps
-
Báo cáo một bản sao hình ảnh tức thời của các tiến trình hiện tại.
Đáp án Bài tập Hướng dẫn
-
oneko
là một chương trình vui nhộn hiển thị một chú mèo đuổi theo con trỏ chuột của bạn. Nếu chưa được cài đặt trong hệ thống, hãy cài đặt nó bằng trình quản lý gói của bản phân phối. Chúng ta sẽ sử dụng nó để hiểu thêm về tác vụ kiểm soát công việc.-
Hãy khởi động chương trình. Làm thế nào để bạn làm được điều này?
Bằng cách gõ
oneko
vào cửa sổ dòng lệnh. -
Hãy di chuyển con trỏ chuột để xem chú mèo đuổi theo nó như thế nào. Sau đó, hãy đình chỉ tiến trình. Làm thế nào để bạn làm được điều này? Đầu ra sẽ là gì?
Bằng cách nhấn tổ hợp phím
Ctrl+z
:[1]+ Stopped oneko
-
Hãy kiểm tra xem bạn hiện đang có bao nhiêu công việc. Bạn sẽ gõ gì? Đầu ra sẽ là gì?
$ jobs [1]+ Stopped oneko
-
Bây giờ, hãy chuyển nó thành một tiến trình chạy ngầm và chỉ định ID công việc của nó. Đầu ra sẽ là gì? Làm thế nào để bạn có thể biết được công việc đang chạy ngầm?
$ bg %1 [1]+ oneko &
-
Cuối cùng, hãy kết thúc công việc chỉ định ID công việc của nó. Bạn sẽ gõ gì?
+
-
$ *kill %1*
-
Hãy khám phá PID của tất cả các tiến trình do máy chủ web Apache HTTPD (
apache2
) tạo ra bằng hai lệnh khác nhau.$ pgrep apache2
hoặc
$ pidof apache2
-
Hãy chấm dứt tất cả các tiến trình
apache2
mà không sử dụng PID của chúng bằng hai lệnh khác nhau.$ pkill apache2
hoặc
$ killall apache2
-
Giả sử bạn phải chấm dứt tất cả các bản thể của
apache2
và bạn không có thời gian để tìm hiểu xem PID của chúng là gì. Bạn sẽ thực hiện điều đó như thế nào bằng cách sử dụngkill
với tín hiệuSIGTERM
mặc định trong một dòng mã?$ kill $(pgrep apache2) $ kill `pgrep apache2`
hoặc
$ kill $(pidof apache2) $ kill `pidof apache2`
NoteVì
SIGTERM
(15
) là tín hiệu mặc định nên ta không cần truyền bất kỳ tùy chọn nào chokill
. -
Hãy bắt đầu
top
và tương tác với nó bằng cách thực hiện như sau:-
Hiển thị chế độ xem cây tiến trình.
Nhấn
V
. -
Hiển thị đường dẫn đầy đủ của các tiến trình phân biệt giữa dung lượng người dùng và dung lượng hạt nhân.
Nhấn
c
.
-
-
Hãy nhập lệnh
ps
để hiển thị tất cả các tiến trình được bắt đầu bởi người dùng Apache HTTPD web server (www-data
):-
Sử dụng cú pháp BSD:
$ ps U www-data
-
Sử dụng cú pháp UNIX:
$ ps -u www-data
-
Sử dụng cú pháp GNU:
$ ps --user www-data
-
Đáp án Bài tập Mở rộng
-
Tín hiệu
SIGHUP
có thể được sử dụng như một cách để khởi động lại một số trình nền nhất định. Với máy chủ web Apache HTTPD — ví dụ — việc gửiSIGHUP
tới tiến trình mẹ (tiến trình được bắt đầu bởiinit
) sẽ chấm dứt tiến trình con của nó. Tuy nhiên, tiến trình mẹ sẽ đọc lại các tệp cấu hình của nó, mở lại các tệp nhật ký và tạo ra một nhóm con mới. Hãy hực hiện các tác vụ sau:-
Khởi động máy chủ web.
$ sudo systemctl start apache2
-
Đảm bảo rằng bạn biết PID của tiến trình mẹ.
$ ps aux | grep apache2
Tiến trình mẹ được bắt đầu bởi người dùng
root
. Trong trường hợp của chúng ta là tiến trình có PID1653
. -
Làm cho máy chủ web Apache HTTPD khởi động lại bằng cách gửi tín hiệu
SIGHUP
tới tiến trình mẹ.$ kill -SIGHUP 1653
-
Kiểm tra và đảm bảo rằng tiến trình mẹ không bị chấm dứt và những tiến trình con mới đã được tạo ra:
$ ps aux | grep apache2
Bây giờ, bạn sẽ thấy tiến trình
apache2
gốc cùng với hai tiến trình con mới.
-
-
Mặc dù ban đầu là tĩnh nhưng đầu ra của
ps
có thể biến thành động bằng cách kết hợpps
vàwatch
. Chúng ta sẽ giám sát máy chủ web Apache HTTPD cho các kết nối mới. Trước khi thực hiện các tác vụ được mô tả bên dưới, bạn nên đọc mô tả về chỉ thịMaxConnectionsPerChild
trong Chỉ thị chung về MPM của Apache.-
Hãy thêm chỉ thị
MaxConnectionsPerChild
với giá trị1
trong tệp cấu hình củaapache2
— trong Debian và các dẫn xuất tại/etc/apache2/apache2.conf
; trong họ CentOS là tại`/etc/httpd/conf/httpd.conf`. Đừng quên khởi động lạiapache2
để các thay đổi có hiệu lực.Dòng cần có trong tệp cấu hình là
MaxConnectionsPerChild 1
. Một cách để khởi động lại máy chủ web là thông quasudo systemctl restart apache2
. -
Nhập lệnh sử dụng
watch
,ps
vàgrep
cho các kết nốiapache2
.$ watch 'ps aux | grep apache2'
hoặc
$ watch "ps aux | grep apache2"
-
Bây giờ, hãy mở trình duyệt web hoặc sử dụng trình duyệt dòng lệnh (chẳng hạn như
lynx
) để thiết lập kết nối với máy chủ web thông qua địa chỉ IP của nó. Bạn sẽ thấy gì trong đầu ra củawatch
?Một trong các tiến trình con do
www-data
sở hữu sẽ biến mất.
-
-
Như chúng ta đã biết, theo mặc định,
top
sẽ sắp xếp các tác vụ dựa vào phần trăm mức sử dụng CPU theo thứ tự giảm dần (giá trị cao hơn ở trên cùng). Hành vi này có thể được sửa đổi bằng các phím tương tácM
(mức sử dụng bộ nhớ),N
(mã định danh duy nhất của tiến trình),T
(thời gian chạy) vàP
(phần trăm thời gian của CPU). Tuy nhiên, bạn cũng có thể sắp xếp danh sách tác vụ theo ý thích của mình bằng cách khởi chạytop
với khóa chuyển-o
(để biết thêm thông tin, hãy xem trang hướng dẫn của top). Bây giờ, hãy thực hiện các tác vụ sau:-
Khởi chạy
top
để các tác vụ được sắp xếp theo mức sử dụng bộ nhớ:$ top -o %MEM
-
Xác minh rằng bạn đã gõ đúng lệnh bằng cách bôi đen cột bộ nhớ:
Nhấn
x
.
-
-
ps
cũng có một khoá chuyểno
để chỉ định các cột bạn muốn hiển thị. Hãy kiểm tra tùy chọn này và thực hiện các tác vụ sau:-
Khởi chạy
ps
để chỉ hiển thị thông tin về người dùng, phần trăm bộ nhớ đã sử dụng, phần trăm thời gian CPU đã sử dụng và lệnh đầy đủ:$ ps o user,%mem,%cpu,cmd
-
Bây giờ, hãy khởi chạy
ps
để thông tin duy nhất được hiển thị là thông tin về người dùng và tên của chương trình họ đang sử dụng:$ ps o user,comm
-