systemctl list services: mọi cách liệt kê dịch vụ trên Linux
- 12 tháng 9, 2026
- 09:00
- Bởi Adrien Roche
- Cập nhật 7 tháng 10, 2026
- Hướng dẫn

Lệnh duy nhất cần nhớ: systemctl list-units --type=service
Trên mọi bản phân phối chạy systemd (Ubuntu từ 15.04, Debian từ 8, RHEL và CentOS từ 7, cùng Fedora, Arch và openSUSE), mỗi dịch vụ là một unit của systemd, và systemctl là công cụ để liệt kê chúng:
systemctl list-units --type=service
Mặc định, lệnh này in ra mọi unit dịch vụ mà systemd đang giữ trong bộ nhớ: các dịch vụ đang hoạt động, có job đang chờ, hoặc đã lỗi. Nó không hiện các dịch vụ đã cài nhưng chưa từng được khởi động. Khi kết quả dài hơn chiều cao terminal, systemctl chuyển nó vào trình phân trang (less). Nhấn q để thoát, hoặc thêm --no-pager để in thẳng ra stdout.
Mỗi dòng có năm cột:
- UNIT: tên unit, ví dụ
ssh.service. Đây chính là tên bạn truyền chosystemctl status,startvàstop. - LOAD: tệp unit có được phân tích đúng hay không (
loaded,not-found,bad-setting,errorhoặcmasked). - ACTIVE: trạng thái tổng quát (
active,inactive,activating,deactivatinghoặcfailed). - SUB: trạng thái chi tiết, tùy theo loại unit; một dịch vụ có thể là
running,exited,dead, v.v. - DESCRIPTION: đoạn mô tả dễ đọc lấy từ tệp unit.
Hãy đọc cặp ACTIVE/SUB cùng nhau: active (running) nghĩa là có một tiến trình đang sống ngay lúc này, còn active (exited) nghĩa là một dịch vụ oneshot đã chạy thành công và kết thúc, điều bình thường với các tác vụ thiết lập, không phải lỗi cần sửa.
Lọc kết quả: đang chạy, bị lỗi hoặc tất cả
Cờ --state= lọc theo bất kỳ giá trị LOAD, ACTIVE hay SUB nào và chấp nhận danh sách phân tách bằng dấu phẩy:
# Only services with a live process
systemctl list-units --type=service --state=running
# Everything loaded, including stopped and dead services
systemctl list-units --type=service --all
# Only failures
systemctl list-units --type=service --state=failed
# Combine states
systemctl list-units --type=service --state=running,exited
systemctl --failed là dạng viết tắt có sẵn của bộ lọc failed, và đáng để chạy theo phản xạ trên mọi máy bạn đăng nhập vào. Để có kết quả dễ xử lý bằng máy, --no-legend bỏ dòng tiêu đề và dòng tổng kết, còn --plain bỏ các ký tự chấm tròn, nhờ đó các cột luôn ổn định cho awk hoặc cut. Để tìm theo tên, hãy chuyển kết quả qua grep: systemctl list-units --type=service --all --no-pager | grep ssh.
Dịch vụ nào khởi động cùng hệ thống: systemctl list-unit-files
list-units trả lời câu hỏi "cái gì đang chạy lúc này?". Để trả lời "cái gì sẽ khởi động khi boot?", hãy liệt kê các tệp unit đã cài trên đĩa:
systemctl list-unit-files --type=service
systemctl list-unit-files --type=service --state=enabled
Ở đây cột STATE mô tả cấu hình khởi động, không phải trạng thái lúc chạy:
enabled: tự động khởi động khi boot (hoặc khi có tác nhân kích hoạt, với các dịch vụ kích hoạt qua socket/timer).disabled: đã cài, nhưng không có gì tự động khởi động nó.static: không có mục[Install]; nó chỉ chạy như một phụ thuộc của unit khác và không thể bật trực tiếp.masked: được liên kết tượng trưng tới/dev/null; systemd từ chối khởi động nó hoàn toàn.generated: được một generator tạo ra lúc chạy, thường từ một init script cũ.
Các phiên bản systemd gần đây còn in thêm một cột preset (VENDOR PRESET hoặc PRESET tùy phiên bản) cho biết giá trị mặc định của bản phân phối. Cái bẫy cần tránh: enabled không có nghĩa là đang chạy, và disabled không có nghĩa là đã dừng. Một dịch vụ có thể bị tắt khởi động nhưng vẫn chạy vì ai đó đã khởi động nó bằng tay, hoặc được bật nhưng đã chết vì bị crash. Khi điều này quan trọng, hãy đối chiếu cả hai danh sách.
Từng dịch vụ một: status, is-active, is-enabled
Khi một dịch vụ khiến bạn chú ý, hãy xem kỹ hơn:
systemctl status nginx
systemctl is-active nginx # prints: active | inactive | failed
systemctl is-enabled nginx # prints: enabled | disabled | static | masked
systemctl is-failed nginx
status cho thấy toàn cảnh: trạng thái ACTIVE/SUB, PID chính, thời gian hoạt động, mức dùng bộ nhớ, cây tiến trình của cgroup và mười dòng journal gần nhất. Khi mười dòng không đủ, hãy vào thẳng journal bằng journalctl -xeu nginx (-u lọc theo unit, -e nhảy tới cuối, -x thêm phần giải thích).
Các lệnh is-* được thiết kế cho script: chúng in ra đúng một từ và đặt mã thoát tương ứng; is-active chỉ thoát với mã 0 khi unit đang hoạt động, còn is-enabled thoát với mã khác 0 cho các unit bị tắt hoặc bị mask. Thêm --quiet để ẩn kết quả in ra và chỉ giữ mã thoát.
Mọi lệnh liệt kê ở trên đều chạy được với người dùng không có đặc quyền. Còn việc thực sự quản lý dịch vụ (start, stop, enable, disable) cần quyền root, vì vậy bạn nên hiểu cách sudo và việc chuyển người dùng hoạt động trên Ubuntu trước khi làm nhiều hơn là đọc trạng thái. Cũng lưu ý rằng các unit cấp người dùng nằm trong một trình quản lý riêng: systemctl --user list-units --type=service liệt kê các dịch vụ chạy trong phiên của chính bạn, đó là lý do một số dịch vụ có vẻ "biến mất" khỏi danh sách hệ thống.
Bảng tra nhanh: những lệnh liệt kê bạn thực sự sẽ dùng
| Lệnh | Nội dung hiển thị |
|---|---|
systemctl list-units --type=service | Các dịch vụ đang hoạt động và bị lỗi hiện có trong bộ nhớ |
systemctl list-units --type=service --all | Mọi dịch vụ đã nạp, kể cả dịch vụ không hoạt động |
systemctl list-units --type=service --state=running | Chỉ các dịch vụ có tiến trình đang chạy |
systemctl --failed | Chỉ các unit bị lỗi: bài kiểm tra sức khỏe hằng ngày |
systemctl list-unit-files --type=service | Mọi dịch vụ đã cài và cấu hình khởi động của chúng |
systemctl list-unit-files --state=enabled | Các unit tự động khởi động khi boot |
systemctl status name | Chi tiết đầy đủ của một dịch vụ, kèm các dòng log gần đây |
systemctl is-active name | Trạng thái một từ cùng mã thoát dễ dùng trong script |
systemctl is-enabled name | Cấu hình khởi động của một dịch vụ |
service --status-all | Danh sách kiểu SysV của các script trong /etc/init.d (tương thích) |
Quy trình thực tế
1. Tìm dịch vụ cứ liên tục bị lỗi
systemctl --failed
systemctl status myapp.service --no-pager -l
journalctl -xeu myapp.service
systemctl reset-failed myapp.service
Bắt đầu rộng với --failed, sau đó đọc kết quả status để xem mã thoát và các dòng log cuối, rồi đào sâu vào journal để có toàn bộ dấu vết. Khi nguyên nhân gốc đã được khắc phục và dịch vụ chạy lại, reset-failed xóa mục failed cũ để lần kiểm tra sức khỏe tiếp theo bắt đầu sạch sẽ.
2. Kiểm tra những gì sẽ khởi động ở lần boot tới
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'
systemd-analyze blame
Lệnh đầu tiên cho bạn một danh sách gọn gàng mọi thứ sẽ tự khởi động, hữu ích trước khi gia cố bảo mật máy chủ hoặc khi truy tìm thứ gì đó bạn đã cài từ nhiều tháng trước rồi quên mất. Sau đó systemd-analyze blame cho thấy mỗi unit mất bao lâu trong lần boot gần nhất, nơi các dịch vụ khởi động chậm lộ ra ngay lập tức.
3. Lệnh một dòng cho script và giám sát
systemctl is-active --quiet nginx && echo up || echo down
systemctl list-units --type=service --state=running --no-legend --plain | awk '{print $1}'
systemctl show -p ActiveState,SubState nginx
systemctl list-units --type=service -o json # systemd 246 or newer
show -p in ra các cặp Key=Value không bao giờ đổi định dạng giữa các phiên bản, và kết quả JSON có thể đưa thẳng vào jq. Nếu bạn thấy mình chạy lại cùng những bước kiểm tra mỗi lần đăng nhập, hãy gói chúng vào một script nhỏ. Hướng dẫn về tệp .sh và shell script của chúng tôi chỉ cách biến đúng loại đoạn lệnh này thành một công cụ dùng lại được.
Không có systemd? service --status-all và OpenRC
Trước khi mặc định rằng systemctl có sẵn, hãy xác nhận máy thực sự chạy gì: kiểm tra hệ điều hành và phiên bản từ dòng lệnh chỉ mất mười giây và cho bạn biết mình có đang dùng bản phân phối systemd hay không. Nếu không có systemctl, bạn đang dùng SysV init hoặc OpenRC:
service --status-all
Trên Debian và Ubuntu, lệnh này duyệt qua /etc/init.d và in [ + ] cho dịch vụ đang chạy, [ - ] cho dịch vụ đã dừng và [ ? ] cho các script không có lệnh status. Nó vẫn chạy được trên các bản phân phối systemd nhờ một lớp tương thích, nhưng chỉ thấy các init script, nên ở đó hãy ưu tiên systemctl. Trên Alpine và Gentoo, OpenRC là hệ thống init: rc-status liệt kê các dịch vụ trong runlevel hiện tại và rc-update show liệt kê những gì mỗi runlevel khởi động.
Mọi điều ở trên đều giả định bạn có một máy Linux mà bạn nắm quyền root và có thể tự do khởi động, làm hỏng rồi sửa các dịch vụ. Nếu bạn cần một máy để thực hành (hoặc một máy sạch để chạy công việc thật), VPS Linux với toàn quyền root của rdp.monster có CPU và RAM riêng, băng thông không giới hạn (sử dụng hợp lý), không cần KYC, và được giao khoảng 10 giây sau khi thanh toán được xác nhận, nên bạn có thể chạy systemctl list-units trên máy chủ của chính mình chỉ trong vòng một phút.
Câu hỏi thường gặp
Vì sao một dịch vụ hiện active (exited) thay vì active (running)?
Type=oneshot (hoặc RemainAfterExit=yes) chạy một tác vụ một lần (mount ổ đĩa, thiết lập tường lửa, dọn dẹp) rồi thoát. Khi đó systemd báo active (exited): unit đã thành công và được coi là "đang bật", nhưng không còn tiến trình nào ở lại. Chỉ các daemon như nginx hay sshd mới hiện active (running). Nếu một dịch vụ mà bạn nghĩ là daemon lại hiện exited, hãy xem tệp unit của nó bằng systemctl cat name.service để biết nó được khai báo thế nào.Các chấm màu trong kết quả systemctl có ý nghĩa gì?
systemctl status và systemctl list-units là chỉ báo trạng thái nhanh: xanh lá cho trạng thái active, trắng cho inactive hoặc đang deactivating, và đỏ cho trạng thái failed hoặc lỗi. Các dòng bị lỗi cũng được tô đỏ trong danh sách, giúp quét kết quả systemctl --failed rất dễ. Trong script hoặc log mà mã màu gây vướng, hãy thêm --plain hoặc chuyển kết quả qua pipe, các ký tự trang trí sẽ biến mất.Có lệnh systemctl nào tương đương chkconfig --list không?
chkconfig --list được thay bằng systemctl list-unit-files --type=service, lệnh hiển thị mọi dịch vụ đã cài và cho biết nó đang enabled, disabled, static hay masked. Với một dịch vụ riêng lẻ, systemctl is-enabled name thay cho chkconfig name, và systemctl enable name thay cho chkconfig name on. Lệnh cũ có thể vẫn tồn tại dưới dạng lớp tương thích, nhưng chỉ bao quát các script SysV cũ.Làm sao ngăn một dịch vụ khởi động cùng hệ thống?
sudo systemctl disable name để xóa liên kết tượng trưng khởi động; thêm --now để dừng nó ngay lập tức. Một dịch vụ đã disable vẫn có thể được khởi động thủ công hoặc được kéo theo như phụ thuộc của unit khác. Nếu bạn muốn nó không bao giờ khởi động, hãy dùng sudo systemctl mask name, lệnh này liên kết unit tới /dev/null để mọi lần thử khởi động đều thất bại. Đảo ngược sau này bằng systemctl unmask. Kiểm tra kết quả bằng systemctl is-enabled name.Adrien Roche, Biên tập viên hạ tầng & hosting
Kỹ sư hệ thống với hơn 10 năm vận hành các hệ thống Windows Server và Linux. Adrien phụ trách tài liệu hạ tầng của rdp.monster và viết các hướng dẫn về RDP, hosting VPS, quản trị máy chủ, mạng và công cụ bảo vệ quyền riêng tư.
Bài viết liên quan




