Quản lý tiến trình trong Linux

Mở đầu

Nhìn chung một hệ thống Linux sẽ khá là ổn định khi được vận hành. Mặc dù không phải lúc nào nó cũng hoạt động một cách suôn sẻ, nhưng ta luôn có cách để các chương trình hoạt động theo một cách tốt nhất có thể. Cũng giống như Windows hay OSX, một hệ thống Linux cũng bao gồm các chương trình con, xử lý một công việc duy nhất và đều được quản lý bởi nhân hệ điều hành là Linux (với WindowsWindowsNTOSX thì là Darwin).

Tiến trình là gì

Hệ thống sẽ không thực sự quản lý toàn bộ các chương trình, mà chỉ quản lý khi nó được thực thi. Một chương trình để có thể thực thi được trên bất cứ một hệ điều hành nào thì nó đều phải ở dạng mã máy, mỗi chương trình chưa rất nhiều các đoạn mã máy (hay mã chỉ dẫn) giúp cho máy tính có thể biết được chương trình sẽ làm gì. Các đoạn mã này sẽ được nạp vào bộ nhớ khi thực thi, được cấp phát vùng hoạt động, thời gian thực thi .... Và khi điều này xảy ra, thay vì gọi là chương trình, ta có một thuật ngữ khác là tiến trình. Và chính xác thì các tiến trình này là những thứ được quản lý bởi một hệ thống/hệ điều hành Linux (hoặc Windows hay OSX)

Những tiến trình đang hoạt động

Khi một hệ thống đã vận hành, có rất nhiều chương trình đã và đang hoạt động cùng nhau, cùng phối hợp để khiến cho hệ thống có thể giúp người dùng xử lý các công việc. Các bản phân phối Linux cũng giống như các hệ điều hành hiện đại ngày nay, hoạt động theo cơ chế đa nhiệm, tức là trong cùng 1 thời điểm có thể có nhiều chương trình cùng (có vẻ) thực thi tại 1 thời điểm. Tất nhiên thực tế điều này không bao giờ xảy ra, các chương trình đã được phân chia thời gian hoạt động và hệ điều hành điều phối hoạt động tốt đến mức ta không nhận ra được các chương trình thực tế đang chạy tuần tự mà nghĩ rằng nó đang chạy song song.

Ngoài sự đa nhiệm, Linux còn hỗ trợ cơ chế đa người dùng, tức là tại 1 thời điểm, có thể có nhiều chương trình được hoạt động với người dùng là những người khác nhau. Hệ điều hành quản lý tất cả các tiến trình này và vẫn đảm bảo trải nghiệm là đồng đều giữa các người dùng cũng như giữa các chương trình. Một chương trình đặc biệt là top có thể giúp ta biết được hệ thống hiện tại có các chương trình nào đang hoạt động.

Lệnh top cho ta biết khá nhiều thông tin của các tiến trình

  • Dòng thứ nhất cho biết thời gian uptime (từ lúc khởi động) cũng như số người dùng thực tế đang hoạt động.
  • Dòng thứ hai là thống kê về số lượng tiến trình, bao gồm tổng số tiến trình (total), số đang hoạt động (running), số đang ngủ/chờ (sleeping), số đã dừng (stopped) và số không thể dừng hẳn (zombie).
  • Dòng thứ 3-5 lần lượt cho biết thông tin về CPU, RAM và bộ nhớ Swap
  • Các dòng còn lại liệt kê chi tiết về các tiến trình như định danh (PID), người dùng thực thi (USER), độ ưu tiên (PR), dòng lệnh thực thi (COMMAND) .....

Một lệnh khác là ps cũng giúp ta liệt kê được chi tiết của tiến trình tuy nhiên có một vài điểm khác với top

  • Chỉ hiện thị từ dòng thứ 6 của lệnh top.
  • Nếu top hiển thị một cách realtime các tiến trình thì ps chỉ hiện thị thông tin tại thời điểm khởi chạy lệnh.
  • topps đều có thể dùng kết hợp với piping tuy nhiên như vậy thì tính realtime của top sẽ không có ý nghĩa.

Kết thúc một tiến trình đang hoạt động

Một ngày nào đó, hệ thống đang vận hành bình thường, bạn đang làm những công việc thường ngày vẫn làm. Tuy nhiên, cái trình duyệt bạn đang dùng tự nhiên bị treo (not responding), bạn thử tắt nó nhưng không có gì thay đổi. Và lúc này để xử lý cái trình duyệt khó chịu đó bạn có thể sử dụng các công cụ dòng lệnh, bao gồm pskill. Lệnh kill được dùng để kết thúc một tiến trình dựa trên định danh của tiến trình PID, và để biết được PID của tiến trình cần buộc kết thúc, ta có thể dùng ps kết hợp với redirection bằng grep. Ta sử dụng lệnh sau: ps aux | grep 'opera' (VD với trình duyệt Opera bị treo)

Trình duyệt Opera chạy rất nhiều tiến trình, vậy ta thử tắt chúng đi, sử dụng lệnh kill -9 PID, ở trên hình ta sẽ thử tắt tiến trình có PID = 8768, như vậy command giờ sẽ là: kill -9 8768. Thật tuyệt diệu, trình duyệt Opera đã được đóng lại.

Khi sử dụng lệnh kill với một tiến trình con thì chỉ tiến trình đó được tắt nhưng nếu sử dụng kill với tiến trình cha thì toàn bộ con của nó cũng được tắt theo. Lý do là vì tiến trình con muốn hoạt động được thì phải có 1 tiến trình khác yêu cầu hệ điều hành tạo ra nó. Một tiến trình không thể tự nhiên sinh ra nếu không có một yêu cầu khởi tạo tiến trình được đáp ứng bởi hệ điều hành.

Trong trường hợp khi không thể thao tác bằng chuột hoặc hệ thống không cho phép mở một terminal thì ta có thể sử dụng tổ hợp phím Ctrl+Alt+F<Console> với Console là 1 trong các gía trị từ 1-12. Khi ấn tổ hợp phím này, một giao diện dòng lệnh sẽ được kích hoạt (gọi là tty). Ta có thể sử dụng giao diện dòng lệnh này để kill các tiến trình bị treo. Đặc biệt sau khi kill được các tiến trình đó, ta có thể dùng tổ hợp phím Ctrl+Alt+F7 để quay về giao diện đồ họa. Nếu cách này không hiệu quả (nguyên do là vì CPURAM đều quá tải) thì ta buộc phải khởi động lại hệ thống.

Nhiệm vụ trước nền và sau nền

Thông thường các công việc thực tế cần làm với một hệ thống Linux sẽ không cần quan tấm lắm đến các nhiệm vụ trước nền (foregorund) và sau nền (background). Tuy nhiên có một vài trường hợp đặc biệt cần sử dụng đến tính năng này:

  • Một chương trình cần mất nhiều thời gian để sử dụng, nhưng bạn lại muốn ngay lập tức được chạy một chương trình khác.
  • Bạn đang chạy một chương trình nhưng lại muốn tạm dừng nó lại để chạy một chương trình khác rồi quay lại với cái ban đầu.
  • Khi bạn xử lý một file có dung lượng lớn hoặc biên dịch chương trình, bạn không muốn phải bắt đầu quá trình lại từ đầu sau khi kết thúc nó.

Một số lệnh hữu dụng để giúp ta xử lý các trường hợp này là:

  • jobs: liệt kê danh sách các nhiệm vụ đang chạy
  • &: với việc sử dụng từ khóa này khi kết thúc câu lệnh, một chương trình có thể bắt đầu trong background thay vì foreground như mặc định.
  • fg <job_number>: dùng để đưa một chương trình background trở thành chương trình foreground.
  • Ctrl+z: ngược lại với fg, đưa một chương trình foreground trở thành chương trình background.

Chi tiết về các lệnh trên (^Z tương đương với Ctrl+z):

Lời kết

Trên đây là những giới thiệu và các lệnh cơ bản để quản lý các tiến trình trong hệ thống Linux. Bạn có thể áp dụng để quản lý các tiến trình đang chạy trong hệ thống hiệu quả hơn (đặc biệt cần thiết với những ai thường xuyên làm việc với cửa sổ dòng lệnh). Cảm ơn mọi người đã đọc bài viết.

Tài liệu tham khảo


All Rights Reserved