Quản lý quy trình trong Unix / Linux

Xin chào các bạn học lập trình! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới của các quy trình Unix/Linux. Là một giáo viên khoa học máy tính gần gũi, tôi rất vui mừng được hướng dẫn các bạn qua khái niệm cơ bản này. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - chúng ta sẽ bắt đầu từ cơ bản và dần dần nâng cao. Vậy, hãy lấy một tách cà phê (hoặc trà, nếu đó là sở thích của bạn), và cùng nhau bắt đầu nhé!

Unix / Linux - Processes

Quy trình là gì?

Trước khi bắt đầu, hãy hiểu xem quy trình thực sự là gì. Hãy tưởng tượng bạn đang ở trong một căn bếp náo nhiệt. Mỗi đầu bếp làm một món ăn cụ thể có thể được coi là một quy trình. Họ có riêng mình nguyên liệu (tài nguyên), công thức (chương trình), và mục tiêu (kết quả). Trong thế giới máy tính, một quy trình đơn giản là một chương trình đang được thực thi.

Khởi động một quy trình

Khởi động một quy trình trong Unix/Linux dễ như بازelry! Bạn có thể làm theo hai cách chính:

  1. Quy trình tiền cảnh: Gõ lệnh và nhấn Enter.
  2. Quy trình nền: Thêm dấu ampersand (&) ở cuối lệnh.

Hãy xem một số ví dụ:

# Quy trình tiền cảnh
$ ls -l

# Quy trình nền
$ long_running_command &

Trong ví dụ đầu tiên, ls -l chạy ở tiền cảnh, hiển thị nội dung thư mục. Trong ví dụ thứ hai, lệnh chạy ở nền, cho phép bạn tiếp tục sử dụng终端.

Liệt kê các quy trình đang chạy

Bây giờ, nếu bạn muốn xem tất cả các đầu bếp (quy trình) đang làm việc trong căn bếp (hệ thống) của bạn, lệnh ps sẽ rất hữu ích!

$ ps aux

Lệnh này sẽ hiển thị tất cả các quy trình đang chạy. Nó giống như việc bạn nhìn vào mọi góc của căn bếp!

Dưới đây là giải thích của các cột bạn sẽ thấy:

Cột Mô tả
USER Chủ sở hữu của quy trình
PID ID quy trình
%CPU Sử dụng CPU
%MEM Sử dụng bộ nhớ
VSZ Kích thước bộ nhớ ảo
RSS Kích thước bộ nhớ thường trú
TTY Loại终端
STAT Trạng thái quy trình
START Thời gian bắt đầu
TIME Thời gian CPU
COMMAND Tên lệnh

Dừng các quy trình

Đôi khi, một quy trình có thể trở nên khó kiểm soát (giống như một đầu bếp đang đốt tất cả mọi thứ). Trong những trường hợp như vậy, bạn cần phải dừng nó. Đây là cách:

$ kill PID

Thay thế PID bằng ID quy trình bạn muốn kết thúc. Nếu bạn muốn dừng mạnh mẽ hơn, bạn có thể sử dụng:

$ kill -9 PID

Điều này giống như việc bạn sa thải đầu bếp ngay lập tức - một sự kết thúc强制!

Quy trình cha và con

Trong Unix/Linux, các quy trình có một cây gia đình. Khi một quy trình tạo ra một quy trình khác, nó trở thành cha, và quy trình mới là con. Nó giống như một đầu bếp (quy trình cha) giao nhiệm vụ cho các đầu bếp phụ (quy trình con).

Bạn có thể thấy mối quan hệ này bằng cách sử dụng:

$ pstree

Lệnh này hiển thị cây quy trình, minh họa các mối quan hệ cha-con.

Quy trình僵尸 và mồ côi

Bây giờ, hãy nói về một số loại quy trình đặc biệt:

  1. Quy trình僵尸: Một quy trình con đã hoàn thành thực thi nhưng vẫn còn một mục nhập trong bảng quy trình. Nó giống như một đầu bếp đã hoàn thành món ăn nhưng chưa rời khỏi ca làm việc.

  2. Quy trình mồ côi: Một quy trình mà quy trình cha của nó đã kết thúc hoặc bị dừng, nhưng nó vẫn tiếp tục chạy. Hãy tưởng tượng một đầu bếp phụ vẫn làm việc sau khi đầu bếp chính đã về nhà.

Để xem bạn có bất kỳ quy trình僵尸 nào, bạn có thể sử dụng:

$ ps aux | grep Z

Quy trình daemon

Quy trình daemon giống như nhân viên nhà bếp làm việc 24/7. Chúng chạy ở nền và cung cấp các dịch vụ khác nhau. Ví dụ, quy trình sshd lắng nghe các kết nối SSH đến.

Để liệt kê tất cả các quy trình daemon, bạn có thể sử dụng:

$ ps -eo 'tty,pid,comm' | grep ^?

Lệnh top

Lệnh top là một công cụ theo dõi tất cả-in-một cho bếp. Nó cung cấp một视图 động theo thời gian thực của hệ thống đang chạy. Đây là cách sử dụng nó:

$ top

Bạn sẽ thấy bảng tương tự như ps, nhưng nó được cập nhật theo thời gian thực. Nó giống như việc bạn có một luồng trực tiếp của căn bếp!

Job ID so với Process ID

Cuối cùng, hãy làm rõ sự khác biệt giữa Job ID và Process ID:

  • Process ID (PID): Một định danh duy nhất cho mỗi quy trình trong hệ thống.
  • Job ID: Một số được shell gán cho một quy trình được khởi động ở nền.

Bạn có thể xem job IDs bằng cách sử dụng:

$ jobs

Và bạn có thể mang một quy trình nền ra tiền cảnh bằng cách sử dụng:

$ fg %job_id

Nhớ rằng, Job IDs chỉ giới hạn trong phiên shell hiện tại, trong khi PIDs là toàn hệ thống.

Và thế là bạn đã có nó, các bạn! Chúng ta đã bao gồm các khái niệm cơ bản của quản lý quy trình trong Unix/Linux. Nhớ rằng, thực hành là cách tốt nhất để thành thạo, vì vậy đừng ngần ngại thử các lệnh này trên hệ thống của bạn. Chỉ cần cẩn thận với lệnh kill - chúng ta không muốn có bất kỳ việc kết thúc ngẫu nhiên trong căn bếp!

Khi chúng ta kết thúc, tôi nhớ lại một câu chuyện hài từ những ngày đầu dạy học của mình. Tôi đã vô tình kết thúc quy trình của trình soạn thảo văn bản trong khi minh họa lệnh kill, mất đi một giờ công việc không được lưu. Hãy coi đó là một bài học - luôn lưu công việc của bạn trước khi chơi với các quy trình!

Tiếp tục nấu những quy trình và chúc các bạn vui vẻ trong thế giới máy tính!

Credits: Image by storyset