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.

Mục Lục

Biên dịch: Vũ Dũng(vudung@mail.ru)
website:http://khigiacmoquayve.narod.ru
1-9-2005 Voronezh Russian
Hosted by uCoz