Linux

Quản Lý Tiến Trình Trong Linux: ps, top, kill Và systemctl Cho Người Mới

phongdhphongdh
16 phút đọc
Chia sẻ:
Zalo
Quản Lý Tiến Trình Trong Linux: ps, top, kill Và systemctl Cho Người Mới

Một ngày đẹp trời, CPU của VPS bỗng chạy 100% liên tục, website chậm dần rồi không truy cập được nữa. Thủ phạm thường là một tiến trình nào đó bị treo hoặc rơi vào vòng lặp, và việc của quản trị viên là tìm ra nó rồi xử lý gọn gàng mà không làm sập các dịch vụ còn lại.

Đó chính là công việc quản lý tiến trình trong Linux: xem tiến trình bằng ps, theo dõi tài nguyên bằng top, dừng tiến trình bằng kill và quản lý các dịch vụ chạy nền bằng systemctl. Bài viết hướng dẫn quản lý tiến trình trong Linux qua một vòng đời tiến trình thật, từ lúc sinh ra đến lúc bị kết thúc.

1. Tiến trình trong Linux là gì: PID, PPID và trạng thái

Tiến trình (process) là một chương trình đang chạy. Mỗi khi bạn mở một ứng dụng, chạy một lệnh hay khởi động một dịch vụ, hệ điều hành tạo ra một tiến trình tương ứng. Mỗi tiến trình được cấp một mã số định danh duy nhất gọi là PID (process ID), và đều có một tiến trình cha là PPID (parent process ID), tức tiến trình đã sinh ra nó.

Tiến trình có nhiều trạng thái: đang chạy (running), đang ngủ chờ tài nguyên hoặc sự kiện (sleeping), và trạng thái zombie (tiến trình đã kết thúc nhưng tiến trình cha chưa thu dọn thông tin). Phần lớn tiến trình trên máy chủ ở trạng thái ngủ và chỉ thức dậy khi có việc, điều này hoàn toàn bình thường. Tiến trình mang PID 1 là tiến trình đầu tiên hệ thống khởi tạo, trên Ubuntu hiện đại đó là systemd, gốc của toàn bộ cây tiến trình.

Hiểu ba khái niệm PID, PPID và trạng thái giúp bạn đọc đúng mọi công cụ phía sau. Toàn bộ việc quản lý tiến trình trong Linux thực chất là xoay quanh việc quan sát các tiến trình theo PID, lần theo quan hệ cha con khi có sự cố, và gửi tín hiệu đúng lúc cho đúng tiến trình. Giữ bức tranh này trong đầu, các lệnh ps, top và kill sẽ trở nên rất dễ hiểu.

Nắm được PID, PPID và trạng thái, bạn đã có khung sườn để mọi thao tác quản lý tiến trình trong Linux trở nên có hệ thống.

2. Lệnh ps trong Linux: xem danh sách tiến trình

Lệnh ps (process status) chụp nhanh danh sách tiến trình tại một thời điểm. Dạng dùng phổ biến nhất là ps aux, liệt kê mọi tiến trình của mọi người dùng kèm mức sử dụng CPU và RAM. Các cột quan trọng gồm USER là chủ sở hữu tiến trình, PID là mã định danh, %CPU và %MEM là mức tài nguyên đang chiếm, STAT là trạng thái, và COMMAND là lệnh đã khởi chạy tiến trình.

Danh sách tiến trình bằng ps aux và ps -ef, hai dạng hiển thị phổ biến khi quản lý tiến trình trong Linux

Dạng thứ hai trong ảnh là ps -ef, thiên về quan hệ cha con với cột PPID rõ ràng. Cột TIME cho biết tổng thời gian CPU mà tiến trình đã tiêu thụ, một manh mối quý khi săn tiến trình chạy quá lâu. Khi biết tên chương trình cần tìm, hãy kết hợp ps với grep qua pipe, ví dụ ps aux | grep nginx để chỉ hiển thị các tiến trình của Nginx.

Lệnh ps trong Linux chỉ là ảnh chụp tĩnh tại thời điểm chạy lệnh, khác với top là màn hình động ở phần sau. Vì tính tĩnh này, ps rất hợp để ghi lại bằng chứng trong báo cáo sự cố hoặc dùng trong script kiểm tra định kỳ. Gõ ps aux --sort=-%mem | head là mẹo hay để liệt kê ngay nhóm tiến trình ăn RAM nhất trên máy.

Rèn được thói quen quan sát bằng ps và top, bạn đã đi được nửa chặng đường của quản lý tiến trình trong Linux.

Khi máy chủ chậm bất thường, phản xạ đầu tiên của quản trị viên là mở top, bước khởi đầu quen thuộc của quản lý tiến trình trong Linux.

Trong thực tế, lệnh ps trong Linux kết hợp grep qua pipe là cặp đôi tìm kiếm tiến trình được gõ nhiều nhất mỗi ngày.

3. Lệnh top trong Linux: theo dõi CPU và RAM trực tiếp

Lệnh top hiển thị bảng tiến trình cập nhật liên tục theo thời gian thực, mặc định sắp xếp theo mức dùng CPU giảm dần. Phần đầu màn hình tóm tắt tình trạng toàn hệ thống: thời gian hoạt động, tải trung bình (load average), tổng số tiến trình, phần trăm CPU đang dùng và lượng RAM còn trống. Nhấn phím q để thoát khỏi top.

Màn hình lệnh top với thông tin tải hệ thống và danh sách tiến trình theo thời gian thực

Trong ảnh là kết quả của top chạy dạng chụp một lần. Hệ thống đang khá nhàn rỗi với tải trung bình thấp và ít tiến trình. Khi máy gặp sự cố quá tải, top là nơi đầu tiên quản trị viên nhìn vào: tiến trình nào đang đứng đầu danh sách với %CPU hoặc %MEM cao bất thường chính là nghi phạm chính.

Một số phím thao tác trong top đáng nhớ: phím M sắp xếp theo RAM, phím P sắp xếp theo CPU, phím k cho phép nhập PID để kết thúc tiến trình ngay trong top. Lệnh top trong Linux còn có phiên bản nâng cấp là htop với giao diện màu và thao tác bằng chuột, đáng cài thêm khi bạn phải theo dõi máy chủ thường xuyên.

Khác với ảnh chụp tĩnh của ps, lệnh top trong Linux cho bạn xem hệ thống đang vận hành như thế nào theo từng giây.

4. Chạy tiến trình nền bằng ký hiệu & và lệnh jobs

Mặc định, một lệnh chạy ở chế độ tiền cảnh (foreground) và chiếm giữ terminal cho đến khi chạy xong. Thêm ký hiệu & vào cuối lệnh, tiến trình sẽ chạy ở chế độ nền (background) và terminal được trả lại ngay để bạn gõ lệnh tiếp theo. Hệ thống in ra số thứ tự công việc kèm PID của tiến trình vừa sinh.

Chạy lệnh sleep ở chế độ nền bằng ký hiệu &, xem danh sách bằng jobs và tìm tiến trình bằng ps

Trong ảnh thực hành, lệnh sleep 300 & tạo một tiến trình ngủ năm phút ở chế độ nền với PID 5844. Lệnh jobs liệt kê các công việc nền của phiên terminal hiện tại, cho thấy công việc số 1 đang chạy. Lệnh ps -ef | grep sleep xác nhận tiến trình sleep tồn tại thật trong hệ thống, và dòng thứ hai của kết quả chính là tiến trình grep đang tìm kiếm, một hiện tượng quen thuộc khi lọc ps bằng grep.

Ngoài jobs, hai lệnh đi kèm là fg đưa một công việc nền về tiền cảnh và bg cho công việc đang tạm dừng chạy tiếp ở nền. Tổ hợp phím Ctrl + Z tạm dừng tiến trình tiền cảnh hiện tại. Đây là bộ công cụ quản lý phiên làm việc cơ bản, đặc biệt hữu ích khi chạy các tác vụ dài như sao lưu hay biên dịch ngay trong terminal.

Lệnh ps trong Linux cho bạn ảnh chụp tĩnh, lệnh top trong Linux cho bạn bộ phim trực tiếp, và cả hai cùng kể câu chuyện về sức khỏe hệ thống.

Hiểu jobs và chế độ chạy nền giúp việc quản lý tiến trình trong Linux ngay trong terminal trở nên gọn gàng hơn nhiều.

5. Lệnh kill trong Linux: dừng tiến trình đúng cách

Khi một tiến trình cần bị dừng, lệnh kill sẽ gửi tín hiệu đến nó theo cú pháp kill PID. Với tiến trình nền thuộc phiên terminal hiện tại, có thể dùng ký hiệu công việc kill %1 thay cho PID. Mặc định kill gửi tín hiệu SIGTERM, yêu cầu tiến trình tự dọn dẹp và kết thúc một cách lịch sự, giống như bạn đóng ứng dụng bằng nút thoát thông thường.

Dừng tiến trình nền bằng kill %1, xác nhận qua jobs và kiểm tra lại bằng pgrep

Ảnh trên ghi lại trọn vẹn vòng đời kết thúc: kill %1 dừng tiến trình sleep đang chạy nền, lệnh jobs ngay sau đó báo trạng thái Terminated cho công việc số 1, và pgrep -a sleep không còn trả về kết quả nào, xác nhận tiến trình đã biến mất khỏi hệ thống. Lệnh pgrep là cách nhanh để tìm PID theo tên chương trình mà không cần lọc ps thủ công.

Quy trình chuẩn khi xử lý tiến trình treo là luôn thử SIGTERM trước và chờ vài giây. Nếu tiến trình vẫn không chịu dừng, mới nâng cấp lên tín hiệu mạnh ở phần sau. Việc tôn trọng thứ tự này giúp ứng dụng kịp ghi nốt dữ liệu đang dang dở, tránh hỏng file hoặc mất dữ liệu đang nằm trong bộ nhớ đệm.

Dùng lệnh kill trong Linux đúng thứ tự tín hiệu là ranh giới giữa xử lý sự cố chuyên nghiệp và gây thêm sự cố.

6. Các tín hiệu kill quan trọng: SIGTERM 15 và SIGKILL 9

Lệnh kill thực chất là lệnh gửi tín hiệu, và tín hiệu quyết định cách tiến trình phản ứng. Mỗi tín hiệu có một tên và một mã số, truyền bằng cú pháp kill -số PID hoặc kill -tên PID. Ba tín hiệu quản trị viên dùng nhiều nhất được tổng hợp trong bảng dưới đây.

Tín hiệuSốÝ nghĩaKhi nào dùng
SIGHUP1Ngắt kết nối, nhiều dịch vụ hiểu là nạp lại cấu hìnhYêu cầu dịch vụ đọc lại file cấu hình
SIGTERM15Yêu cầu kết thúc, tiến trình được tự dọn dẹpLựa chọn mặc định khi dừng tiến trình
SIGKILL9Ép kết thúc ngay lập tức, tiến trình không phản kháng đượcBiện pháp cuối khi SIGTERM không hiệu quả

Lệnh kill -9 PID nổi tiếng vì sức mạnh tuyệt đối của nó, nhưng chính vì tiến trình bị cắt đột ngột không kịp dọn dẹp, dữ liệu đang ghi dở có thể bị hỏng và các file tạm bị bỏ lại. Vì vậy SIGKILL luôn là lựa chọn cuối cùng, không phải lựa chọn đầu tiên. Gõ kill -l để xem toàn bộ danh sách tín hiệu hệ thống hỗ trợ.

Một lệnh họ hàng tiện dụng là killall tên-chương-trình, dừng mọi tiến trình trùng tên cùng lúc, và pkill dừng theo mẫu tên linh hoạt hơn. Cả hai đều mạnh và nguy hiểm tương xứng: hãy kiểm tra bằng pgrep trước để biết chính xác những tiến trình nào sẽ bị ảnh hưởng trước khi ra tay thật.

Gửi sai tín hiệu là sai lầm đắt giá nhất khi dùng lệnh kill trong Linux trên một máy chủ đang chạy thật.

SIGKILL mạnh nhưng mù quáng; lệnh kill trong Linux chỉ phát huy giá trị khi người dùng hiểu rõ tín hiệu mình sắp gửi đi.

7. Systemctl: quản lý tiến trình dạng dịch vụ

Các chương trình chạy dài hạn phục vụ hệ thống như web server, cơ sở dữ liệu hay SSH được tổ chức thành các dịch vụ (service) do systemd quản lý. Thay vì kill trực tiếp PID của chúng, cách đúng là dùng systemctl: sudo systemctl status tên-dịch-vụ xem trạng thái, start và stop để bật tắt, restart để khởi động lại, và enable để dịch vụ tự chạy khi mở máy.

Xem các dịch vụ đang chạy và trạng thái chi tiết một dịch vụ bằng systemctl

Trong ảnh, lệnh systemctl --type=service --state=running liệt kê các dịch vụ đang hoạt động trên máy, nổi bật là systemd-journald phụ trách ghi log hệ thống. Lệnh status cho dịch vụ này cho thấy nó đang active, thời điểm khởi động và tiến trình chính kèm PID. Khi một website mất kết nối cơ sở dữ liệu, kiểm tra status của dịch vụ cơ sở dữ liệu là bước chẩn đoán đầu tiên.

Phân biệt rõ hai tầng là chìa khóa của quản lý tiến trình trong Linux: tiến trình thường do người dùng tự chạy thì quản lý bằng ps, kill và jobs; tiến trình dịch vụ thuộc hệ thống thì quản lý bằng systemctl. Tự ý kill PID của một dịch vụ có thể khiến systemd tự khởi động lại nó ngay lập tức theo cấu hình, làm bạn tưởng lệnh của mình không có tác dụng.

Phân biệt tiến trình thường và tiến trình dịch vụ là bài học cốt lõi của quản lý tiến trình trong Linux, với systemctl là đại diện tiêu biểu.

8. Kịch bản thực tế: xử lý một tiến trình treo trên VPS

Ghép mọi mảnh lại thành một quy trình xử lý sự cố hoàn chỉnh. Bước một, mở top để xác định tiến trình nào đang chiếm CPU hoặc RAM bất thường và ghi lại PID của nó. Bước hai, dùng ps -fp PID xem chi tiết tiến trình đó thuộc người dùng nào, chạy từ lệnh nào và có tiến trình cha là gì, tránh ra tay nhầm vào tiến trình hệ thống.

Bước ba, nếu đó là dịch vụ hệ thống, xử lý bằng systemctl với lệnh restart hoặc stop tương ứng. Nếu là tiến trình thường, gửi SIGTERM bằng kill PID và chờ vài giây. Bước bốn, kiểm tra lại bằng top hoặc pgrep: tiến trình đã biến mất chưa, tải hệ thống đã trở lại bình thường chưa. Chỉ khi SIGTERM thất bại mới dùng đến kill -9 như biện pháp cuối cùng.

Sau khi dập xong sự cố, đừng quên bước năm là tìm nguyên nhân gốc: tiến trình đó vì sao treo, có phải do thiếu RAM, do dữ liệu đầu vào bất thường hay do lỗi phần mềm. Nhật ký hệ thống xem bằng journalctl và log riêng của ứng dụng là nơi chứa câu trả lời. Xử lý tiến trình chỉ là cắt ngọn, hiểu nguyên nhân mới giúp sự cố không quay lại. Hướng dẫn chính thức về systemd có tại trang tài liệu của dự án systemd.

Ở tầng dịch vụ, quản lý tiến trình trong Linux nhường sân cho systemctl, nhưng nguyên tắc kiểm tra trước khi hành động vẫn giữ nguyên.

Một quy trình xử lý tiến trình treo bài bản luôn bắt đầu bằng lệnh top trong Linux để tìm nghi phạm, không bắt đầu bằng kill.

9. Lỗi thường gặp khi quản lý tiến trình

Lỗi đầu tiên là dùng kill -9 ngay từ đầu cho mọi trường hợp. Thói quen này sớm muộn cũng gây mất mát dữ liệu với các ứng dụng như cơ sở dữ liệu. Hãy coi SIGKILL như công cụ phá cửa: chỉ dùng khi cửa đã khóa chặt và không còn cách mở thông thường nào khác, sau khi đã thử SIGTERM và chờ đợi hợp lý.

Lỗi thứ hai là kill nhầm PID. PID thay đổi theo thời gian, máy càng chạy lâu càng dễ nhìn nhầm dòng trong lúc vội. Trước khi Enter, hãy đối chiếu lại PID bằng lệnh ps kèm bộ lọc tên tiến trình. Với các tiến trình thuộc người dùng khác hoặc của hệ thống, cân nhắc thật kỹ vì hậu quả lan rộng hơn một ứng dụng đơn lẻ.

Lỗi thứ ba là hoảng loạn trước tiến trình zombie. Zombie thực chất đã chết, không tốn CPU hay RAM ngoài một dòng trong bảng tiến trình, và thường tự biến mất khi tiến trình cha thu dọn hoặc kết thúc. Bạn không thể kill một zombie vì nó không còn chạy; xử lý phải nhắm vào tiến trình cha của nó.

Sau cùng, quản lý tiến trình trong Linux giỏi không nằm ở việc thuộc nhiều lệnh, mà ở kỷ luật kiểm tra trước khi ra tay.

10. Câu hỏi thường gặp về quản lý tiến trình trong Linux

Khác nhau giữa ps và top là gì? Ps là ảnh chụp tĩnh tại một thời điểm, hợp để tra cứu và viết script. Top là màn hình động cập nhật liên tục, hợp để quan sát biến động tài nguyên và phát hiện tiến trình bất thường đang diễn ra ngay lúc đó. Cả hai đều là công cụ cốt lõi của quản lý tiến trình trong Linux.

Load average cao nghĩa là gì? Load average là số tiến trình trung bình đang chờ được xử lý trong một, năm và mười lăm phút gần nhất. Khi con số này vượt xa số nhân CPU của máy trong thời gian dài, hệ thống đang quá tải. Hãy dùng top để tìm tiến trình chiếm nhiều tài nguyên nhất và xử lý theo quy trình trong bài.

Kill rồi mà tiến trình vẫn còn thì sao? Có thể tiến trình đang ở trạng thái không thể ngắt (thường do chờ phần cứng hoặc ổ đĩa), hoặc đó là dịch vụ được systemd tự khởi động lại. Hãy kiểm tra trạng thái bằng cột STAT trong ps và kiểm tra xem tiến trình có thuộc một dịch vụ nào không trước khi thử các biện pháp mạnh hơn.

Có nên kill tiến trình lạ chiếm nhiều RAM không? Đừng vội. Hãy xác định nó thuộc dịch vụ hay ứng dụng nào bằng ps và tìm kiếm thông tin về tên tiến trình đó trước. Một số tiến trình hệ thống hoặc bộ nhớ đệm trông có vẻ tốn RAM nhưng hoàn toàn bình thường, và việc dừng chúng có thể kéo theo sự cố lớn hơn.

Một tiến trình zombie không đáng sợ; đáng sợ là người quản trị hoảng loạn và dùng lệnh kill trong Linux sai đối tượng.

11. Lời kết

Bài viết đã hoàn thiện bức tranh quản lý tiến trình trong Linux: khái niệm PID và PPID, xem tiến trình bằng ps, theo dõi trực tiếp bằng top, chạy nền và quản lý công việc bằng jobs, kết thúc tiến trình bằng kill với từng mức tín hiệu, và quản lý dịch vụ bằng systemctl. Đây là bộ kỹ năng xử lý sự cố nền tảng mà mọi quản trị viên Linux đều phải thành thạo.

Để biến kiến thức thành phản xạ, hãy tự tạo một tiến trình sleep chạy nền, quan sát nó bằng cả ps lẫn top, rồi kết thúc nó lần lượt bằng SIGTERM qua số công việc và qua PID. Chỉ sau vài lần thực hành như vậy, lần tới khi VPS quá tải thật, bạn sẽ bình tĩnh mở top và xử lý đúng quy trình thay vì khởi động lại máy trong hoảng loạn.

Chia sẻ bài viết này:
Zalo
phongdh

phongdh

Tác giả bài viết • Content Creator

Chào mọi người, mình là Phong - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Email/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau.

Kết nối:

Bài viết liên quan

Những bài viết bạn có thể quan tâm

Thảo luận 0 bình luận Viết bình luận

Email được bảo mật và không hiển thị công khai.

Chưa có bình luận. Hãy là người mở đầu cuộc trò chuyện.

Zalo