Để làm việc trên Linux, chúng ta tương tác với hệ điều hành thông qua các lệnh (command). Hệ Điều Hành xem mỗi đơn thể mã lệnh mà nó điều khiển là tiến trình. Một chương trình có thể bao gồm nhiều tiến trình kết hợp với nhau. Đối với Hệ Điều Hành, các tiến trình cùng hoạt động chia sẻ tốc độ xử lý của CPU, cùng dùng chung vùng nhớ và tài nguyên hệ thống khác. Các tiến trình được điều phối xoay vòng bởi Hệ Điều Hành. Mỗi lệnh trên Linux khi thực thi sẽ run một process hoặc một group các processes. Chính vì vậy, những hiểu về tiến trình và kỹ năng quản lý và sử dụng tiến trình trên hệ thống Linux là hết sức cần thiết. Trong bài viết này, mình sẽ giới thiệu đến các bạn những kiến thức và kỹ năng cơ bản để quản lý các tiến trình trên hệ thống Linux.
Tiến trình cha và tiến trình con
Khi một tiến trình sinh ra một tiến trình khác thì
Tiến trình ban đầu được gọi là tiến trình cha (PPID)
Tiến trình mới được gọi là tiến trình con
Tương tác giữa tiến trình cha và tiến trình con
Khi tiến trình con đang chạy thì tiến trình cha sẽ chờ
Khi tiến trình con hoàn thành thì tiến trình cha sẽ tiếp tục thực thi và tiến trình con sẽ được kết thúc
Các trạng thái của tiến trình
Trạng thái | Mô tả |
Run | Tiến trình đang chạy |
Sleep | Tiến trình đang ở trạng thái chờ hoạt động |
Zombie | Tiến trình mà tiến trình cha đã kết thúc |
Stop | Tiến trình đã dừng hoạt động |
Quản lý tiến trình (lệnh ps)
Lệnh ps
là một công cụ mạnh mẽ để hiển thị thông tin chi tiết về các tiến trình
ps [option]
Một số option
Option | Chức năng |
-ef | Hiển thị tất cả các tiến trình |
-e -u username | Lọc theo người dùng |
-C name | Lọc theo tên tiến trình |
-ef -p id | Lọc theo ID tiến trình |
-e -o -pid,uname,pcpu,pmem,comm | Hiển thị các cột cụ thể |
-e –sort=-pcpu -o pid,pcpu,comm | Sắp xếp các tiến trình theo cách sử dụng |
ps -o pid=Process,ruser=RealUser,comm=Command | Đổi tên tiêu đề cột |
-e -forest | Hiển thị kết quả theo kiểu cây phân cấp |
-p -4041 -L | Hiển thị các thread bên trong tiến trình |
-f -U root -u root | Hiển thị tất cả các tiến trình root |
VD: Hiển thị 10 tiến trình sử dụng bộ nhớ và CPU cao nhất
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
VD: Để hiển thị bối cảnh bảo mật (cụ thể cho SELinux)
ps -eM
VD: Hiển thị cây tiến trình cho một tiến trình nhất định
ps -f –forest
VD: Hiển thị mọi tiến trình hoạt động trên hệ thống Linux ở định dạng BSD
ps -au
Tạo và quản lý tiến trình mới trong Linux (lệnh fork và exec)
Trong Unix/Linux, để tạo một tiến trình mới, chúng ta có thể sử dụng cặp lệnh fork và exec.
fork sẽ tạo một bản sao của quá trình gọi nó.
exec sẽ thay thế chương trình hiện tại với một chương trình mới. Với việc sử dụng hợp lý các lệnh trên giúp hệ thống có khả năng chạy nhiều tiến trình đồng thời giúp tối ưu hơn về hoạt động của hệ thống.
Với lệnh exec bạn có thể thực thi một tiến trình mà không cần fork một tiến trình mới. Tiến trình mới sẽ thay thế tiến trình cũ và có PID của tiến trình cũ
Tiến trình Background , Foreground
Foreground process (Tiến trình tương tác) – chúng được khởi tạo và kiểm soát bởi một terminal session. Lấy input từ người dùng và hiển thị output ra màn hình. Khi chạy tiến trình này, không thể truy cập vào command line để chạy cây lệnh khác.
Background process (Tiến trình không tương tác) là tiến trình không kết nối với terminal. Không cần input từ người dùng. Khi chạy tiến trình này, nó không làm ảnh hưởng đến terminal session nên có thể chạy các tiến trình khác. Trong quá trình quản lý process bạn cần lưu ý Command Interpreter cũng có thể chạy process ở dạng nền bằng cách thêm dấu “&” . Với cách này, process bị đẩy xuống chạy ngầm (background) nên bạn sẽ có thể tiếp tục kiểm soát shell với các command khác mà không cần mở thêm shell mới
jobs: Lệnh để hiển thị các process đang chạy background (ngầm) với job_number tương ứng
jobs
Sau khi đã định vị job_number của process cần tìm, để đưa một backgroud job đến foreground chạy lệnh
fg %job_number
lệnh bg là lệnh giúp chạy tiếp một tiến trình đang bị tạm dừng ở background bằng cách gửi tín hiệu SIGCONT
bg %job_number
Kiểm soát tiến trình (lệnh kill và pkill)
Lệnh kill được dùng để gửi tín hiệu để dừng một tiến trình thông qua số PID hoặc ID
kill [option] [process_id]
Chấm dứt chương trình bằng tín hiệu SIGINT
kill -2 [process_id]
Báo cho hệ điều hành chấm dứt ngay một tiến trình
kill -9 [process_id]
Báo hiệu hệ điều hành để tạm dừng chương trình cho đến khi nhận được tín hiệu SIGCONT
kill -17 [process_id]
VD: Chấm dứt một tiến trình python có PID 103683
kill -9 103683
Lệnh pkill cũng được sử dụng để kết thúc các tiến trình như lệnh kill, tuy nhiên nó cho phép bạn tìm và kết thúc tiến trình dựa trên tên tiến trình thay vì PID
pkill [option] [name_process]
VD: pkill bắt đầu chấm dứt tất cả các chương trình đang chạy bằng cách gửi tín hiệu 15 (TERM). Nếu bạn muốn dừng tất cả các quy trình Firefox
pkill -15 firefox
VD: Tùy chọn -u được sử dụng để chỉ định pkill phù hợp với các tiến trình đang được chạy bởi một người dùng cụ thể
pkill -u kali
Quản lý ưu tiên và tài nguyên (lệnh nice và renice)
Trong các hệ thống Linux, có tổng cộng 140 mức ưu tiên với giá trị Nice nằm trong khoảng từ -20 đến +19 trong đó +19 đại diện cho mức ưu tiên thấp nhất và -20 là mức ưu tiên cao nhất. Như bạn đã lưu ý, đây là mối quan hệ tỷ lệ nghịch giữa giá trị Nice và giá trị ưu tiên.
Lệnh nice thực hiện một chương trình với một ưu tiên lập lịch tùy chỉnh . Giá trị dao động từ -20 (mức ưu tiên cao nhất) đến 19 (mức thấp nhất).
nice [niceness_value] [command-arguments]
VD: Đặt giá trị nice là -20 ( mức ưu tiên cao nhất) cho việc tải xuống một ảnh từ adminvietnam.org
nice --20 wget https://adminvietnam.org/wp-content/uploads/2024/03/image-218.png
Lệnh renice dùng thay đổi mức độ ưu tiên của một hoặc nhiều tiến trình đang chạy. Giá trị độ bền dao động từ -20 (thuận lợi nhất cho tiến trình) đến 19 (ít thuận lợi nhất cho tiến trình).
renice -n [niceness_value] -p [pid_of_the_process]
VD: Giả sử bạn muốn thay đổi giá trị Nice của quy trình gnome-keyring-d
ps -el | grep gnome-keyring-d
Từ đầu ra, giá trị Nice là 0. Chúng ta sẽ đặt nó thành 5, như hiển thị bên dưới, PID ở đây là 1141
renice -n 5 -p 1141
Theo dõi Tiến Trình (lệnh top)
top [option]
Một số option
Option | Chức năng |
-h | Hiển thị phiên bản hiện tại |
-c | Tham số này chuyển đổi trạng thái cột lệnh từ hiển thị lệnh sang hiển thị tên chương trình và ngược lại |
-d | Chỉ định thời gian trễ khi refresh màn hình |
-o | Sắp xếp theo trường được đặt tên |
-p | Chỉ hiển thị các tiến trình với ID được chỉ định |
-u | Chỉ hiển thị những tiến trình của người dùng được chỉ định |
-i | Không hiển thị các idle task |
VD: ẩn các idle task , chế độ xem mặc định trong top có thể hơi lộn xộn và nếu bạn chỉ muốn xem các tiến trình đang hoạt động
top -i
VD: chỉ định thời gian trễ giữa các lần refresh màn hình sau mỗi 5s
top -d 5
Cảm ơn các bạn đã theo dõi bài viết.