Thứ sáu, 06/09/2013 | 00:00 GMT+7

Cách sử dụng ps, kill và hay để quản lý các tiến trình trong Linux

Server Linux, giống như bất kỳ máy tính nào khác mà bạn có thể quen thuộc, chạy các ứng dụng. Đối với máy tính, chúng được coi là "quy trình".


Mặc dù Linux sẽ xử lý quản lý mức thấp , cấp thấp trong vòng đời của một quy trình, nhưng bạn cần một cách tương tác với hệ điều hành để quản lý nó từ cấp cao hơn.

Trong hướng dẫn này, ta sẽ thảo luận về một số khía cạnh đơn giản của quản lý quy trình. Linux cung cấp một bộ sưu tập phong phú các công cụ cho mục đích này.

Ta sẽ khám phá những ý tưởng này trên VPS Ubuntu 12.04, nhưng bất kỳ bản phân phối Linux hiện đại nào cũng sẽ hoạt động theo cách tương tự.

Cách xem các tiến trình đang chạy trong Linux


hàng đầu


Cách dễ nhất để tìm hiểu những quy trình nào đang chạy trên server của bạn là chạy lệnh top :

top 

top - 15:14:40 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05 Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   1019600k total,   316576k used,   703024k free,     7652k buffers Swap:        0k total,        0k used,        0k free,   258976k cached    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init                    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.07 ksoftirqd/0             6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0             7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0              8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset                  9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper                10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs           

Phần thông tin hàng đầu cung cấp số liệu thống kê của hệ thống, chẳng hạn như tải hệ thống và tổng số tác vụ.

Bạn có thể dễ dàng nhận thấy rằng có 1 tiến trình đang chạy và 55 tiến trình đang ngủ (hay còn gọi là nhàn rỗi / không sử dụng tài nguyên CPU).

Phần dưới cùng có các quy trình đang chạy và số liệu thống kê sử dụng của chúng.

htop


Một version cải tiến của top , được gọi là htop , có sẵn trong repository . Cài đặt nó bằng lệnh này:

sudo apt-get install htop 

Nếu ta chạy lệnh htop , ta sẽ thấy rằng có một màn hình thân thiện với user hơn:

htop 

  Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05    CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running   Swp[                         0/0MB]     Uptime: 00:58:11    PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command  1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop     1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init   311 root       20   0 17224   636   440 S  0.0  0.1  0:00.07 upstart-udev-brid   314 root       20   0 21592  1280   760 S  0.0  0.1  0:00.06 /sbin/udevd --dae   389 messagebu  20   0 23808   688   444 S  0.0  0.1  0:00.01 dbus-daemon --sys   407 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.02 rsyslogd -c5   408 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5   409 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5   406 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.04 rsyslogd -c5   553 root       20   0 15180   400   204 S  0.0  0.0  0:00.01 upstart-socket-br 

Bạn có thể tìm hiểu thêm về cách sử dụng top và htop tại đây.

Cách sử dụng ps để liệt kê các quy trình


Cả tophtop cung cấp giao diện đẹp mắt để xem các tiến trình đang chạy tương tự như trình quản lý tác vụ đồ họa.

Tuy nhiên, những công cụ này không phải lúc nào cũng đủ linh hoạt để đáp ứng đầy đủ tất cả các tình huống. Một lệnh mạnh mẽ được gọi là ps thường là câu trả lời cho những vấn đề này.

Khi được gọi mà không có đối số, kết quả có thể hơi thiếu sáng:

ps 

  PID TTY          TIME CMD  1017 pts/0    00:00:00 bash  1262 pts/0    00:00:00 ps 

Đầu ra này hiển thị tất cả các quy trình được liên kết với user hiện tại và phiên terminal . Điều này có ý nghĩa vì hiện tại ta chỉ chạy bashps với terminal này.

Để có bức tranh đầy đủ hơn về các quy trình trên hệ thống này, ta có thể chạy như sau:

ps aux 

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root         1  0.0  0.2  24188  2120 ?        Ss   14:28   0:00 /sbin/init root         2  0.0  0.0      0     0 ?        S    14:28   0:00 [kthreadd] root         3  0.0  0.0      0     0 ?        S    14:28   0:00 [ksoftirqd/0] root         6  0.0  0.0      0     0 ?        S    14:28   0:00 [migration/0] root         7  0.0  0.0      0     0 ?        S    14:28   0:00 [watchdog/0] root         8  0.0  0.0      0     0 ?        S<   14:28   0:00 [cpuset] root         9  0.0  0.0      0     0 ?        S<   14:28   0:00 [khelper] . . . 

Các tùy chọn này yêu cầu ps hiển thị các quy trình do tất cả user sở hữu ( dù liên kết terminal của họ là gì) ở định dạng thân thiện với user .

Để xem chế độ xem dạng cây , nơi các mối quan hệ phân cấp được minh họa, ta có thể chạy lệnh với các tùy chọn sau:

ps axjf 

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND     0     2     0     0 ?           -1 S        0   0:00 [kthreadd]     2     3     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]     2     6     0     0 ?           -1 S        0   0:00  \_ [migration/0]     2     7     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]     2     8     0     0 ?           -1 S<       0   0:00  \_ [cpuset]     2     9     0     0 ?           -1 S<       0   0:00  \_ [khelper]     2    10     0     0 ?           -1 S        0   0:00  \_ [kdevtmpfs]     2    11     0     0 ?           -1 S<       0   0:00  \_ [netns] . . . 

Như bạn thấy , quy trình kthreadd được hiển thị là cha của quy trình ksoftirqd/0 và các quy trình khác.

Lưu ý về ID quy trình


Trong các hệ thống giống như Linux và Unix, mỗi quy trình được gán một ID quy trình hoặc PID . Đây là cách hệ điều hành xác định và theo dõi các quy trình.

Một cách nhanh chóng để lấy PID của một quy trình là sử dụng lệnh pgrep :

pgrep bash 

1017 

Điều này sẽ chỉ đơn giản là truy vấn ID quy trình và trả về.

Quá trình đầu tiên sinh ra khi khởi động, được gọi là init , được cung cấp PID là “1”.

pgrep init 

1 

Quá trình này sau đó chịu trách nhiệm sinh ra mọi quá trình khác trên hệ thống. Các quy trình sau này được cung cấp số PID lớn hơn.

Cha mẹ của một tiến trình là tiến trình chịu trách nhiệm sinh ra nó. Các quy trình mẹ có PPID , bạn có thể thấy PPID này trong tiêu đề cột trong nhiều ứng dụng quản lý quy trình, bao gồm top , htopps .

Bất kỳ giao tiếp nào giữa user và hệ điều hành về các quy trình liên quan đến việc dịch giữa các tên quy trình và PID tại một số thời điểm trong quá trình hoạt động. Đây là lý do tại sao các tiện ích cho bạn biết PID.

Mối quan hệ giữa cha mẹ và con cái


Việc tạo một quy trình con diễn ra theo hai bước: fork (), tạo ra không gian địa chỉ mới và sao chép các tài nguyên do cha sở hữu thông qua copy-on-write để có sẵn cho quy trình con; và execute (), tải một file thực thi vào không gian địa chỉ và thực thi nó.

Trong trường hợp một process con chết trước cha của nó, thì con đó sẽ trở thành một thây ma cho đến khi cha mẹ thu thập được thông tin về nó hoặc chỉ ra cho kernel rằng nó không cần thông tin đó. Các tài nguyên từ tiến trình con sau đó sẽ được giải phóng. Tuy nhiên, nếu process cha chết trước đứa trẻ, đứa trẻ sẽ được init nhận nuôi, mặc dù nó cũng có thể được gán lại cho một process khác.

Cách gửi tín hiệu xử lý trong Linux


Tất cả các quy trình trong Linux đều phản hồi các tín hiệu . Tín hiệu là một cách cấp hệ điều hành để yêu cầu các chương trình chấm dứt hoặc sửa đổi hành vi của chúng.

Cách gửi tín hiệu xử lý bằng PID


Cách phổ biến nhất để truyền tín hiệu đến một chương trình là sử dụng lệnh kill .

Như bạn có thể mong đợi, chức năng mặc định của tiện ích này là cố gắng giết một quá trình:

<pre>
kill <span class = “highlight”> PID của target_process </span>
</pre>

Điều này sẽ gửi tín hiệu TERM đến quá trình. Tín hiệu TERM cho biết quá trình vui lòng kết thúc. Điều này cho phép chương trình thực hiện các hoạt động dọn dẹp và thoát một cách trơn tru.

Nếu chương trình hoạt động sai và không thoát ra khi có tín hiệu TERM, ta có thể báo cáo tín hiệu bằng cách chuyển tín hiệu KILL :

<pre>
kill -KILL <span class = “highlight”> PID của target_process </span>
</pre>

Đây là một tín hiệu đặc biệt không được gửi đến chương trình.

Thay vào đó, nó được cấp cho kernel của hệ điều hành, làm tắt quá trình. Điều này được sử dụng để bỏ qua các chương trình bỏ qua các tín hiệu được gửi đến chúng.

Mỗi tín hiệu có một số liên quan có thể được chuyển thay cho tên. Ví dụ: Bạn có thể chuyển “-15” thay vì “-TERM” và “-9” thay vì “-KILL”.

Cách sử dụng tín hiệu cho các mục đích khác


Tín hiệu không chỉ được sử dụng để tắt các chương trình. Chúng cũng được dùng để thực hiện các hành động khác.

Ví dụ: nhiều daemon sẽ khởi động lại khi chúng được cấp tín hiệu HUP hoặc tín hiệu treo máy. Apache là một chương trình hoạt động như thế này.

<pre>
sudo kill -HUP <span class = “highlight”> pid of apache </span>
</pre>

Lệnh trên sẽ khiến Apache reload file cấu hình của nó và tiếp tục cung cấp nội dung.

Bạn có thể liệt kê tất cả các tín hiệu có thể gửi với kill bằng lệnh :

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 . . . 

Cách gửi tín hiệu xử lý theo tên


Mặc dù cách gửi tín hiệu thông thường là thông qua việc sử dụng PID, nhưng cũng có những phương pháp thực hiện việc này với các tên tiến trình thông thường.

Lệnh pkill hoạt động gần giống như cách kill , nhưng thay vào đó nó hoạt động trên một tên tiến trình:

pkill -9 ping 

Lệnh trên tương đương với:

kill -9 `pgrep ping` 

Nếu bạn muốn gửi một tín hiệu đến mọi trường hợp của một quy trình nhất định, bạn có thể sử dụng lệnh killall :

killall firefox 

Lệnh trên sẽ gửi tín hiệu TERM đến mọi version firefox đang chạy trên máy tính.

Cách Điều chỉnh Ưu tiên Quy trình


Thông thường, bạn cần điều chỉnh quy trình nào được ưu tiên trong môi trường server .

Một số quy trình có thể được coi là nhiệm vụ quan trọng đối với tình huống của bạn, trong khi những quy trình khác có thể được thực thi khi nào có thể còn tài nguyên.

Linux kiểm soát mức độ ưu tiên thông qua một giá trị được gọi là độ đẹp .

Các nhiệm vụ có mức độ ưu tiên cao được coi là kém tốt đẹp hơn, vì chúng cũng không chia sẻ tài nguyên. Mặt khác, các quy trình có mức độ ưu tiên thấp là tốt vì chúng nhấn mạnh vào việc chỉ sử dụng các nguồn lực tối thiểu.

Khi ta chạy top ở đầu bài viết, có một cột được đánh dấu “NI”. Đây là giá trị tốt đẹp của quá trình:

top 

 Tasks:  56 total,   1 running,  55 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 Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers Swap:        0k total,        0k used,        0k free,   264812k cached    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND             1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                     1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init                    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.11 ksoftirqd/0 

Giá trị tốt có thể nằm trong repository ảng từ “-19 / -20” (mức độ ưu tiên cao nhất) và “19/20” (mức độ ưu tiên thấp nhất) tùy thuộc vào hệ thống.

Để chạy một chương trình với một giá trị tốt nhất định, ta có thể sử dụng lệnh nice :

<pre>
Nice -n 15 <span class = “highlight”> lệnh để thực thi </span>
</pre>

Điều này chỉ hoạt động khi bắt đầu một chương trình mới.

Để thay đổi giá trị tốt đẹp của một chương trình đã được thực thi, ta sử dụng một công cụ có tên là renice :

<pre>
renice 0 <span class = “highlight”> PID để ưu tiên </span>
</pre>

Lưu ý: Trong khi tốt đẹp hoạt động với một tên lệnh cần thiết, renice hoạt động bằng cách gọi quá trình PID

Kết luận


Quản lý quy trình là một chủ đề mà đôi khi user mới khó nắm bắt vì các công cụ được sử dụng khác với các công cụ đồ họa của chúng.

Tuy nhiên, những ý tưởng quen thuộc và trực quan, và với một chút thực hành, sẽ trở nên tự nhiên. Bởi vì các quy trình liên quan đến mọi thứ bạn làm với hệ thống máy tính, học cách kiểm soát hiệu quả chúng là một kỹ năng cần thiết.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin liên quan

Cách xem người dùng hệ thống trong Linux trên Ubuntu
2013-09-05
Cách sử dụng mật khẩu và trình bổ sung để quản lý mật khẩu trên VPS Linux
2013-09-04
Cách cài đặt Linux, Lighttpd, MySQL và PHP5 (LLMP Stack) trên CentOS 6
2013-08-30
Cách sử dụng Top, Netstat, Du và các công cụ khác để giám sát tài nguyên server
2013-08-26
So sánh server Django: server phát triển, Mod_WSGI, uWSGI và Gunicorn
2013-08-19
Giới thiệu khái niệm cơ bản về Linux
2013-08-16
Cách sử dụng SFTP để truyền tệp an toàn bằng server từ xa
2013-08-13
Cách thiết lập server Git riêng trên VPS
2013-08-02
Cách cài đặt và cấu hình firewall server cấu hình (CSF) trên Ubuntu
2013-07-29
Kiến thức cơ bản về quyền của Linux và cách sử dụng Umask trên VPS
2013-07-10