Tất cả những gì bạn cần biết về các quy trình trong Linux (lệnh ps, top, glances,...)

Trong bài viết này, chúng ta sẽ tìm hiểu cơ bản về quá trình và tìm hiểu qua các lệnh (lệnh ps, top, glances,...) để quản lý quy trình trong Linux. Một quy trình đề cập đến một chương trình đang chạy; nó là một phiên bản chạy của một chương trình. Nó bao gồm các chỉ thị chương trình, dữ liệu đọc từ tệp, các chương trình khác hoặc đầu vào từ người dùng hệ thống.

Các loại quy trình

Có hai loại quy trình cơ bản trong Linux:

  • Quy trình nền (còn được gọi là quy trình phi tương tác/tự động) - đây là các quy trình không liên kết với một phiên đang chạy; chúng không mong đợi bất kỳ đầu vào từ người dùng nào.
  • Các quy trình tiền cảnh (còn được gọi là các quy trình tương tác) - chúng được khởi tạo và kiểm soát thông qua phiên cuối. Nói cách khác, phải có người dùng kết nối với hệ thống để bắt đầu các quá trình đó; chúng chưa tự động khởi động như một phần của chức năng/dịch vụ hệ thống.

Quy trình Daemons là gì

Đây là loại đặc biệt của quy trình nền bắt đầu khi khởi động hệ thống và không ngừng hoạt động như một dịch vụ; chúng không chết. Chúng được khởi động như các tác vụ hệ thống (chạy như dịch vụ), ngẫu nhiên. Tuy nhiên, người dùng có thể điều khiển chúng thông qua quy trình khởi động.

Trạng thái quy trình Linux

Tạo ra một quy trình trong Linux

Một quy trình mới thường được tạo ra khi một quy trình hiện có tạo một bản sao chính xác của nó trong bộ nhớ. Quy trình con sẽ có môi trường giống như quy trình cha của nó, nhưng chỉ số ID quy trình là khác nhau.

Có hai cách truyền thống được sử dụng để tạo một quy trình mới trong Linux:

  • Sử dụng chức năng Hệ thống () - phương pháp này tương đối đơn giản, tuy nhiên, không hiệu quả và có rủi ro bảo mật đáng kể.
  • Sử dụng chức năng fork () và exec () - kỹ thuật này phức tạp hơn nhưng cung cấp tính linh hoạt cao hơn, tốc độ và bảo mật tốt hơn.

Làm thế nào Linux nhận diện các quy trình?

Do Linux là một hệ thống đa người dùng, có nghĩa là các người dùng khác nhau có thể chạy các chương trình khác nhau trên hệ thống, mỗi phiên bản chạy của một chương trình phải được nhận diện duy nhất bởi hạt nhân.

Và một chương trình được xác định bằng ID của quy trình (PID) cũng như ID của quá trình cha (PPID) của nó, do đó, quy trình có thể được phân loại thành:

  • Quy trình cha - đây là các quy trình tạo ra các quy trình khác trong quá trình chạy.
  • Quy trình con - các quy trình này được tạo ra bởi các quy trình khác trong quá trình chạy.

Quy trình khởi động

Quá trình khởi động (Init) là nguyên nhân (quá trình cha) của tất cả các quy trình trong hệ thống, nó là chương trình đầu tiên được thực thi khi hệ thống Linux khởi động; nó quản lý tất cả các quy trình khác trong hệ thống. Nó được khởi động bởi chính hạt nhân, vì vậy nguyên tắc, nó không có quá trình cha.

Quy trình khởi động luôn có ID quy trình là 1. Nó hoạt động như một quá trình cha đến tất cả các quy trình mồ côi.

Bạn có thể sử dụng lệnh pidof để tìm ID của một quy trình:

# pidof systemd
# pidof top
# pidof httpd
Tìm ID quy trình Linux

Để tìm ID quy trình và ID quá trình cha của shell hiện tại, chạy lệnh:

$ echo $$
$ echo $PPID
Tìm ID quy trình cha Linux

Bắt đầu một quy trình trong Linux

Khi bạn chạy một lệnh hoặc chương trình (ví dụ: cloudcmd - Trình điều khiển đám mây), nó sẽ khởi động một quy trình trong hệ thống. Bạn có thể khởi động một quy trình nền (tương tác) như sau, nó sẽ được kết nối với terminal và người dùng có thể gửi đầu vào cho nó:

# cloudcmd
Khởi chạy quy trình tương tác Linux

Công việc nền Linux

Để khởi động một quy trình trong nền (phi tương tác), sử dụng kí tự  & , ở đây, quy trình không đọc đầu vào từ người dùng cho đến khi nó được chuyển sang phía trước.

# cloudcmd &
# jobs
Khởi chạy quy trình Linux trong nền

Bạn cũng có thể gửi một quy trình vào phần nền bằng cách đình chỉ nó bằng cách sử dụng [Ctrl + Z], điều này sẽ gửi tín hiệu SIGSTOP đến quy trình, dừng lại hoạt động của nó; nó trở thành trạng thái đợi:

# tar -cf backup.tar /backups/*  #press Ctrl+Z
# jobs

Để tiếp tục chạy lệnh trên đang bị đình chỉ ở phần nền, sử dụng lệnh bg:

# bg

Để gửi một quy trình nền vào phía trước, sử dụng lệnh fg kết hợp với ID công việc như sau:

# jobs
# fg %1
Công việc quá trình nền Linux

Bạn cũng có thể quan tâm: Làm thế nào để khởi chạy lệnh Linux trong nền và tách quy trình trong cửa sổ terminal

Các trạng thái của quy trình trong Linux

Trong quá trình thực thi, một quy trình thay đổi từ một trạng thái sang trạng thái khác tùy thuộc vào môi trường/circumstances của nó. Trong Linux, một quy trình có các trạng thái có thể có sau:

  • Đang chạy - ở đây, quy trình đang chạy (nó là quy trình hiện tại trong hệ thống) hoặc nó sẵn sàng chạy (nó đang chờ được gán cho một trong các CPU).
  • Đang chờ đợi - trong trạng thái này, quy trình đang chờ xảy ra một sự kiện hoặc có một tài nguyên hệ thống nhất định. Ngoài ra, kernel cũng phân biệt hai loại quy trình đang chờ đợi; quy trình đợi tạm dừng có thể bị gián đoạn bởi tín hiệu và quy trình đợi không thể bị gián đoạn - đang chờ trực tiếp trên điều kiện phần cứng và không thể bị gián đoạn bởi bất kỳ sự kiện/tín hiệu nào.
  • Đã dừng - ở trạng thái này, quy trình đã bị dừng lại, thường là do nhận một tín hiệu. Ví dụ, quy trình đang được gỡ lỗi.
  • Zombie - ở đây, quy trình đã chết, nó đã bị dừng lại nhưng vẫn có mục nhập trong bảng quy trình.

Cách xem các quy trình hoạt động trong Linux

Có một số công cụ Linux để xem/danh sách các quy trình đang chạy trên hệ thống, hai công cụ truyền thống và nổi tiếng là ps và top :

1. Lệnh ps

Nó hiển thị thông tin về một số quy trình đang chạy trên hệ thống như dưới đây:

# ps 
# ps -e | head 
Danh sách các quy trình hoạt động Linux

2. top - Công cụ giám sát hệ thống

top là một công cụ mạnh mẽ cung cấp cho bạn một cái nhìn thời gian thực về một hệ thống đang chạy như được hiển thị trong ảnh chụp màn hình dưới đây:

# top 
Danh sách các quy trình đang chạy Linux

Đọc thêm về các ví dụ sử dụng top: 12 ví dụ sử dụng lệnh TOP trong Linux

3. glances - Công cụ giám sát hệ thống

glances là một công cụ giám sát hệ thống tương đối mới với các tính năng tiên tiến:

# glances
Glances - Công cụ Giám sát Quá trình Linux

Để biết thêm hướng dẫn sử dụng toàn diện, hãy đọc: Glances - Một công cụ Giám sát Hệ thống Thời gian thực tiên tiến cho Linux

Có nhiều công cụ giám sát hệ thống Linux hữu ích khác bạn có thể sử dụng để liệt kê các quy trình hoạt động, mở liên kết bên dưới để đọc thêm về chúng:

  1. 20 Công cụ Dòng lệnh để Giám sát Hiệu suất Linux
  2. 13 Công cụ Giám sát Linux Hữu ích khác

Cách điều khiển quy trình trong Linux

Linux cũng có một số lệnh để điều khiển quy trình như kill, pkill, pgrep và killall, dưới đây là một số ví dụ cơ bản về cách sử dụng chúng:

$ pgrep -u tecmint top
$ kill 2308
$ pgrep -u tecmint top
$ pgrep -u tecmint glances
$ pkill glances
$ pgrep -u tecmint glances
Điều khiển quy trình Linux

Để tìm hiểu cách sử dụng các lệnh này chi tiết, để kết thúc/mất các quy trình hoạt động trong Linux, mở liên kết bên dưới:

  1. Một hướng dẫn về lệnh Kill, Pkill và Killall để Kết thúc Quá trình Linux
  2. Làm thế nào để Tìm và Kết thúc Quá trình đang chạy trong Linux

Lưu ý rằng bạn có thể sử dụng chúng để kết thúc các ứng dụng không phản hồi trong Linux khi hệ thống bị đóng băng.

Gửi tín hiệu từ quá trình

Cách cơ bản để điều khiển quy trình trong Linux là gửi tín hiệu cho chúng. Có nhiều tín hiệu bạn có thể gửi đến một quy trình, để xem tất cả các tín hiệu, chạy:

$ kill -l
Liệt kê Tất cả các Tín hiệu Linux

Để gửi tín hiệu cho một quy trình, sử dụng các lệnh kill, pkill hoặc pgrep chúng ta đã đề cập trước đó. Tuy nhiên, các chương trình chỉ có thể phản hồi tín hiệu nếu chúng được lập trình nhận ra các tín hiệu đó.

Và hầu hết các tín hiệu là để sử dụng nội bộ bởi hệ thống, hoặc cho các nhà lập trình khi họ viết mã. Dưới đây là các tín hiệu hữu ích đối với người dùng hệ thống:

  • SIGHUP 1 - gửi đến một quy trình khi các phiên điều khiển của nó bị đóng.
  • SIGINT 2 - gửi đến một quy trình bởi điều khiển phiên của nó khi người dùng gián đoạn tiến trình bằng cách nhấn [Ctrl+C].
  • SIGQUIT 3 - gửi đến một quy trình nếu người dùng gửi tín hiệu gỡ bằng [Ctrl+D].
  • SIGKILL 9 - tín hiệu này chấm dứt ngay lập tức (kết thúc) một quy trình và quy trình sẽ không thực hiện bất kỳ hoạt động làm sạch nào.
  • SIGTERM 15 - tín hiệu kết thúc chương trình (kill sẽ gửi tín hiệu này theo mặc định).
  • SIGTSTP 20 - được gửi đến một quy trình bởi terminal điều khiển của nó để yêu cầu dừng (dừng terminal); được bắt đầu bởi người dùng nhấn [Ctrl+Z].

Dưới đây là các ví dụ lệnh kill để kết thúc ứng dụng Firefox bằng cách sử dụng PID của nó một khi nó bị đóng băng:

$ pidof firefox
$ kill 9 2687
OR
$ kill -KILL 2687
OR
$ kill -SIGKILL 2687  

Để kết thúc một ứng dụng bằng tên của nó, sử dụng pkill hoặc killall như sau:

$ pkill firefox
$ killall firefox 

Thay đổi ưu tiên quy trình Linux

Trên hệ thống Linux, tất cả các quy trình hoạt động đều có một ưu tiên và một giá trị thân thiện nhất cụ thể. Các quy trình có ưu tiên cao thường sẽ nhận được nhiều thời gian CPU hơn các quy trình ưu tiên thấp hơn.

Tuy nhiên, người dùng hệ thống có quyền root có thể ảnh hưởng đến điều này bằng cách sử dụng các lệnh nice và renice.

Từ kết quả của lệnh top, NI hiển thị giá trị thân thiện quy trình:

$ top  
Danh sách các quy trình đang chạy Linux

Sử dụng lệnh nice để đặt giá trị thân thiện cho một quy trình. Hãy nhớ rằng người dùng thông thường có thể gán giá trị thân thiện từ 0 đến 20 cho các quy trình mà họ sở hữu.
Chỉ người dùng root mới sử dụng các giá trị thân thiện âm.

Để thay đổi ưu tiên của một quy trình, sử dụng lệnh renice như sau:

$ renice +8  2687
$ renice +8  2103

Tóm lại, trong bài viết này, chúng ta đã thảo luận về các quy trình trong Linux và các công cụ như lệnh ps, top, glances và nhiều công cụ khác để theo dõi và quản lý các quy trình trên hệ thống. Việc hiểu rõ về các quy trình là một phần quan trọng trong việc quản lý hệ thống Linux, và sử dụng các công cụ như lệnh ps có thể giúp bạn theo dõi và phân tích hiệu suất của hệ thống một cách hiệu quả.