Kiến Thức Cơ Bản Slackware Linux
5.4 Điều khiển
các tiến trình(Process Control).
Bất kì một chương trình đang thực thi gọi là một
tiến trình.Tất cả từ X-Windows tới các trình hệ
thống mà khởi động khi bật máy được coi là tiến
trình.Mỗi một tiến trình được chạy bằng tên một
tài khoản nào đó.Tiến trình được thực thi
khi hệ thống khởi động thông thường dưới quyền root hoặc
là nobody.Những tiến trình được thực hiện bởi bạn sẽ mang
tên bạn.Tiến trình của các tài khoản
khác sẽ mang tên của họ.
Bạn có thể quản lý các tiến trình của
bạn.Còn root có thể quản lý mọi tiến trình
trên hệ thống kể cả của các tài khoản
khác.Các tiến trình có thể được điều
khiển,theo dõi bởi các chương trình đặc biệt hoặc
một số lệnh trên vỏ lệnh.
5.4.1 Chuyển
sang chế độ phông nền(backgrounding)
Chương trình chạy trên vỏ lệnh thường được hiển thị trước
nền phông.Nó cho phép bạn nhìn thấy hết
thông tin,hành động của chương trình.Tuy nhiên
khi bạn không muốn chương trình cản trở màn
hình terminal của bạn.Công việc đó gọi là
thực hiện ở chế độ phông nền.Có nhiều cách để chuyển
một chương trình về chế độ phông nền.
Phương pháp đầu tiên là bổ sung kí tự
"&" vào cuối của dòng lệnh gọi chương
trình.Ví dụ như bạn nghe nhạc mp3 bằng amp trong catalog
hiện hành.Nhưng bạn không muốn nó chiếm lấy terminal
đấy bởi vì bạn muốn làm các việc khác
nữa.Hãy thực hiên lệnh sau:
$ amp *.mp3 &
Chương trình sẽ được chạy và bạn lại quay về với lời mời
trên vỏ lệnh như lần đầu.
Còn có cách khác để chuyển chương
trình sang chế độ phông nền nhưng tiến hành trong
khi chương trình đang chạy.Bạn hãy khởi động chương
trình,nhấn ctrl+z.Chương trình tạm dừng.Tóm lại
đó là tam dừng.Nó bị đình chỉ hoạt động tại
thời điểm hiện tại nhưng mà có thể tiếp tục bất cứ
lúc nào.Khi mà bạn vừa mới dừng chương trình
lại và quay lại với vỏ lệnh thì để chuyển nó sang
chế độ phông nền hãy nhập vào lệnh:
$ bg
Như vậy tiến trình tạm dừng đã chuyển sang làm
việc trong phông nền.
5.4.2
Thoát khỏi chế độ phông nền
Nếu như bạn cần làm việc với các tiền tình ẩn
trong phông nền thì bạn có thể gọi nó
ra.Hãy dung lệnh:
$ fg
Sau đó chương trình lại chiếm giữ terminal của
bạn,đôi khi chương trình trên phông nền tự động
kết thúc,khi đó bạn nhìn thấy thông
báo sau:
[1]+
Done
/bin/ls $LS_OPTIONS
Có nghĩa là tiến trình trong phông nền
đã kết thúc(khi đấy ls - không quan tâm đến
nó)
Khi cùng một lúc có nhiều tiến trình chayi
đồng thời trong phông nền,muốn gọi chúng trở lại
bình thường thì phải biết được bạn cần tiến trình
nào.Nếu như chỉ đơn giản thực hiện fg thì tiến
trình phông nền cuối cùng sẽ được gọi quay trở lại
bình thường.Thật may mắn bash có thể kiểm soát được
tất cả các tiến trình.Lệnh đó là jobs
và nó hình dung là:
$ jobs
[1] Stopped vim
[2]- Stopped amp
[3]+ Stopped man ps
Lệnh này đưa ra danh sách các tiến trình
trong phông nền.Như bạn thấy,chúng đang tạm dừng,và
hãy nhìn vào số ID của từng tiến trình.Bạn
nhìn thấy với tiến trình "man ps" có số ID
là "[3]+" có nghĩa là nó sẽ được gọi ra bằng
lệnh fs không có tham biến đi kèm.
Nếu như bạn muốn gọi ra lại tiến trình vim thì hãy
nhập vào lệnh:
$ fg 1
Vim sẽ được hiển thị lại trên terminal của bạn,Việc chuyển
các tiến trình vào chế độ phông nền có
lợi nếu như bạn chỉ có một terminal.Bạn có thể sử dụng
đồng thời nhiều chương trình và chuyển đổi giữa
chúng theo ý muốn.
5.4.3 ps
Như vậy là bạn đã biết cách làm việc với
các tiến trình trên và trong phông
nền.Tuy nhiên vẫn có nhiều tiến trình thực hiện
trong suốt thời gian hoạt động hệ thống.Bạn muốn kiểm soát
chúng.Hãy sử dụng lệnh ps(1).Nó
có rất nhiều tham biến đi kèm,chúng tôi chỉ
đưa ra các tham biến chính.Để có thêm
thông tin hãy xem ở phần 2.2.1
Lệnh ps thông thường chỉ hiển thị như sau:
$ ps
PID TTY TIME CMD
7923
ttyp0 00:00:00 bash
8059
ttyp0 00:00:00 ps
Không nên để ý rằng các tiến trình
không nhiều mà thông tin về nó lại đại
khái,hình thức.Bạn có thử bao nhiều lần cũng thế
với lệnh ps thông thường.Vậy chúng có ý nghĩa
gì.
Chúng có thể hiểu như sau:
PID
Kí hiệu nhận dạng tiến trình(ID).Mỗi một
tiến trình có một PID khác nhau.Trong kernel 2.2.x
thì ID của các tiến trình nằm trong khoảng 1 tới
32767.Mỗi một tiến trình sẽ có được một PID ngẫu
nhiên.Khi mà tiến trình kết thúc thì
các số PID cũng được giải phóng.Khi mà số PID
đã cực đại thì số PID tiếp theo sẽ là số nhỏ nhất
trong các số đã được giải phóng.Tuy nhiên sẽ
có sự thay đổi ở nhân 2.4.x.Chúng sẽ được biểu diễn
ở dạng 32-bits PID.
TTY
cho biết trên terminal nào tiến trình được
thực hiện.Lệnh ps đơn thuần chỉ hiển thị các tiến trình
trên terminal hiện hành.Trong ví dụ trên
các tiến trình đều thuộc tty0.Nó thông
báo cho ta biết các tiến trình được thực hiện hoặc
là trên các máy từ xa hoặc là từ
X-terminal
TIME
cho biết các tiến trình thực hiện trong bao
lâu.Tuy nhiên nó khác với thời gian thực tế
tính từ thời điểm bắt đầu.Nhớ là Linux là hệ thống
đa nhiệm.Chính vì thế trong bất cứ thời điểm nào
cũng có nhiều tiến trình đang thực thi.Tuy nhiên
chúng chiếm giữ processor không
lâu.Chính vì thế trong cột TIME chỉ ra khoảng thời
gian có thể nói nhỏ hơn thời gian thực tế rất nhiều.Nếu
như một trong số chúng lâu hơn khoảng một phút
thì có lẽ sẽ có một cái gì đó
không ổn.
CMD
Cuối cùng là chỉ ra tên chương
trình đang thực hiện.Nó hiển thị chỉ tên của chương
trình.Những tham biến đi kèm cùng những thông
tin khác không được hiển thị.Để hiển thị các
thông tin đấy bạn cần phải có những tham biến đi kèm
lệnh ps.
Bạn có thể nhận được một bảng danh sách các tiến
trình đang thực thi nếu sử dụng các tham biến đi
kèm.Hãy thử lệnh sau:
PID
TTY STAT TIME COMMAND
1 ?
S 0:05 init
2 ?
SW 0:00 [keventd]
3 ?
SWN 0:00 [ksoftirqd_CPU0]
4 ?
SW 0:01 [kswapd]
5 ?
SW 0:00 [bdflush]
6 ?
SW 0:00 [kupdated]
10 ?
SW< 0:00 [mdrecoveryd]
11 ?
SW 0:00 [kjournald]
22 ?
SW 0:00 [kjournald]
76 ?
SW 0:00 [eth0]
150 ?
SW 0:00 [khubd]
850 ?
S 0:00 [rpc.portmap]
856 ?
S 0:00 /usr/sbin/syslogd
859 ?
S 0:00 /usr/sbin/klogd -c 3 -x
861 ?
S 0:00 /usr/sbin/inetd
864 ?
S 0:00 /usr/sbin/sshd
873 ?
S 0:00 [lpd]
876 ?
S 0:00 /usr/sbin/crond -l10
878 ?
S 0:00 [atd]
881 ?
S 0:00 [sendmail]
884 ?
S 0:00 [sendmail]
891 ?
S 0:00 /usr/sbin/gpm -m /dev/mouse -t ps2
893 tty1 S
0:00 -bash
894 tty2 S
0:00 /sbin/agetty 38400 tty2 linux
895 tty3 S
0:00 /sbin/agetty 38400 tty3 linux
896 tty4 S
0:00 /sbin/agetty 38400 tty4 linux
897 tty5 S
0:00 /sbin/agetty 38400 tty5 linux
898 tty6 S
0:00 /sbin/agetty 38400 tty6 linux
Hầu như các tiến trình trên được thực thi trong qua
trình khởi động hệ thống Linux.Trong hệ thống của
mình,tôi đã thay đổi một số thứ để bạn nhìn
thấy rõ hơn cái gì đó khác biệt.Tuy
nhiên đại đa số bạn sẽ nhìn thấy trên hệ thống của
bạn.Như bạn thấy tham biến đi kèm với ps đã bắt nó
hiển thị không chỉ tên của lệnh mà các tham
biến đi cùng lệnh.Tuy nhiên vẫn còn có những
cột thông tin hấp dẫn hơn.
Có lẽ bạn sẽ để ý ngay đến các tiến trình
thực hiện trên tty "?".Đó là các tiến
trình không được thực hiện trên các
terminal hiện hành.
Bây giờ bạn nhìn thấy cột "STAT".Nó
cho biết trạng thái(status) của tiến trình.S sử dụng cho các tiến
trình đang ngủ:đó là các tiến trình
đang đợi để tiếp tục.Z sử dụng cho các tiến trình zombied(nửa sống,nửa chết).Đó
là các tiến trình mà tiến trình cha
mẹ sinh đã kết thúc và chỉ để lại các
tiến trình con ở lại.Điều này không tốt.
Nếu bạn muốn thêm thông tin nữa hãy thực hiện lệnh
sau:
$ ps -aux
USER PID %CPU %MEM
VSZ RSS TTY STAT START
TIME COMMAND
root 1 0.0
0.0 480 64
? S
Aug21 0:05 init
root 2 0.0
0.0 0 0
? SW
Aug21 0:00 [keventd]
root 3 0.0
0.0 0 0
? SWN Aug21
0:00 [ksoftirqd_CPU0]
root 4 0.0
0.0 0 0
? SW
Aug21 0:01 [kswapd]
root 5 0.0
0.0 0 0
? SW
Aug21 0:00 [bdflush]
root 6 0.0
0.0 0 0
? SW
Aug21 0:00 [kupdated]
root 10 0.0
0.0 0 0
? SW<
Aug21 0:00 [mdrecoveryd]
root 11 0.0
0.0 0 0
? SW
Aug21 0:00 [kjournald]
root 22 0.0
0.0 0 0
? SW
Aug21 0:00 [kjournald]
root 76 0.0
0.0 0 0
? SW
Aug21 0:00 [eth0]
root 150 0.0
0.0 0 0
? SW
Aug21 0:00 [khubd]
rpc 850 0.0
0.1 2360 676 ?
S Aug21 0:00 [rpc.portmap]
root 856 0.0 0.1
2280 728 ?
S Aug21 0:00 /usr/sbin/syslogd
root 859 0.0 0.1
2216 576 ?
S Aug21 0:00 /usr/sbin/klogd -c 3 -x
root 861 0.0 0.1
2252 644 ?
S Aug21 0:00 /usr/sbin/inetd
root 864 0.0 0.2
3888 1240 ?
S Aug21 0:00 /usr/sbin/sshd
lp 873 0.0
0.2 4196 1128 ?
S Aug21 0:00 [lpd]
root 876 0.0 0.1
2340 704 ?
S Aug21 0:00 /usr/sbin/crond -l10
daemon 878 0.0 0.1 2344
748 ? S
Aug21 0:00 [atd]
root 881 0.0 0.2
4132 1308 ?
S Aug21 0:00 [sendmail]
smmsp 884 0.0 0.2 4128
1208 ? S
Aug21 0:00 [sendmail]
root 891 0.0 0.1
2260 572 ?
S Aug21 0:00 /usr/sbin/gpm -m /dev/mouse
-t ps2
root 893 0.0 0.2
3132 1128 tty1 S
Aug21 0:00 -bash
root 894 0.0 0.1
2212 516 tty2 S
Aug21 0:00 /sbin/agetty 38400 tty2 linux
root 895 0.0 0.1
2212 516 tty3 S
Aug21 0:00 /sbin/agetty 38400 tty3 linux
root 896 0.0 0.1
2212 516 tty4 S
Aug21 0:00 /sbin/agetty 38400 tty4 linux
root 897 0.0 0.1
2212 516 tty5 S
Aug21 0:00 /sbin/agetty 38400 tty5 linux
root 898 0.0 0.1
2212 516 tty6 S
Aug21 0:00 /sbin/agetty 38400 tty6 linux
Đây có thể nói là một khối lượng thông
tin đầy đủ.Bạn có thể nhìn thấy ai đã chạy
chương trình,chiếm bao nhiêu tài nguyên
CPU(%CPU,%MEM,VSZ,RSS),ngày tháng khi chương trình
chạy.Rõ ràng đây là những thông tin cần
thiết cho administrator.Nêu như thông tin không hiển
thị trên màn hình thì tham biến "-w"
có thể hiển thị.
Hiển thị thông tin trên màn hình tuy
không qua dễ nhìn nhưng mà bạn vẫn có thể
làm việc.Tuy nhiên đó không phải là tất
cả,vẫn còn có nhiều thông tin khác về
các tiến trình.Hãy xem man-pages của ps để
có thêm thông tin.
5.4.4 kill
Đôi khi có cái gi không như mong muốn xảy đến
với chương trình của bạn.Nó làm cho hệ thống rối
loạn và cần phải lập lại trật tự trên nó.Chương
trình kill(1) giúp bạn trong trường hợp
đó.Nó có thể sử dụng để tiêu diệt các
tiến trình bằng nhiều cách khác nhau theo mục
đích của bạn.
Nếu như chương trình của bạn vượt ra ngoài kiểm
soát,chiếm giữ nhiều tài nguyên processor hoặc
là chúng tồn tại trong bộ nhớ,điều này làm
bạn không thích và đi đến quyết định tiêu
diệt nó.Để tiêu diệt các tiến trình,bạn cần
phải biết PID hoặc tên của nó.Để có thể biết đuợc
PID bạn hãy dùng ps như phần trên.Ví dụ để
tiêu diệt tiến trình 4747 bạn thực hiện lệnh sau:
$ kill 4747
Tuy nhiên chú ý là để tiêu diệt tiến
trình bạn phải là chủ sở hữu của nó.Mục đích
của việc này chính là vấn đề an toàn.Nếu bạn
có thể tiêu diệt tiến trình của những người
khác thì sẽ sảy ra những hành động trả thù
lẫn nhau trên hệ thống của bạn.Tuy nhiên root có thể
tiêu diệt bất cứ tiến trình nào.
Một chương trình nữa có thể nói là anh em
với kill là killall(1).Tính năng của nó là
sử dụng tên của chương trình.Nó tiêu diệt tất
cả các chương trình có tên đã chỉ
ra.Chẳng hạn bạn muốn tiếu diệt tất cả các tiến trình vim
thì hãy sử dụng lệnh sau:
$killall vim
Tất cả các tiến trình có tên vim sẽ bị
tiêu diệt.Nếu bạn sử dụng như root thì nó sẽ
tiêu diệt tất cả các tiến trình vim trên
toàn hệ thống của bất cứ tài khoản nào.
#killall bash
Đôi khi kill cũng không thể thực hiện được công việc
của mình.Một vài tiến trình không thể
tiêu diệt bởi kill thông thường.Bạn cần phải bổ sung cho
nó tham biến đi kèm cụ thể là "-9".
$ kill -9 4747
Chác chắn tiến trình 4747 sẽ bị tiêu diệt.Bạn
có thể sử dụng vẫn với tham biến này cho lệnh killall.Tham
biến này sẽ gửi những tín hiệu khác nhau tới chương
trình.Còn kill thông thường chỉ gửi đến tiến
trình tín hiệu SIGTERM(kết thúc).Còn kill -9
sẽ gửi đến tín hiệu SIGKILL(tiêu diệt).Để nhìn thấy
những tín hiệu mà kill thực hiện,bạn có thể thực
hiện lệnh sau:
$kill -l
1) SIGHUP 2)
SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6)
SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11)
SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15)
SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20)
SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24)
SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO
30) SIGPWR
Kill sẽ sử dụng các số, còn killall sẽ sử dụng
tên loại bỏ phần SIG.Ví dụ như:
$ killall -KILL vim
Có một phương án kill được sử dụng như khởi động chương
trình.Nó gửi tín hiệu SIGHUP và chúng
ta ép buộc chương trình phải đọc lại cấu hình của
mình.Nó thuận lợi khi bạn thay đổi cấu hình của một
chương trình nào đó.
5.4.5 top
Đây là một chương trình dùng để hiển thị
liên tục thông tin về các tiến trình
trên hệ thống.
Để hiển thị bạn hãy thực hiện
$top
Lệnh sẽ đưa ra toàn màn hình thông tin về
các tiến trình đang chạy trên hệ thống,cũng như
những thông tin chung về hệ thống.(mức độ làm việc
processor,tổng số lượng tiến trình,trạng thái processor,bộ
nhớ,PID của từng tiến trình,tên tài khoản,thời gian
thực thi..)
Chương trình có tên là
top,bởi vì có lẽ những thông tin được hiển thị ở
phía trên bảng liệt kê,nó được coi
là rất thuận tiện cho việc xác định chương trình
nào vượt qua giới hạn kiểm soát.
Biên dịch: Vũ Dũng(vudung@mail.ru)
website:http://khigiacmoquayve.narod.ru
1-9-2005 Voronezh Russian