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ả top
và htop
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 bash
và ps
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
, htop
và ps
.
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>
Các tin liên quan
Cách xem người dùng hệ thống trong Linux trên Ubuntu2013-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