RDP Monster

systemctl list services: mọi cách liệt kê dịch vụ trên Linux

systemctl list services: mọi cách liệt kê dịch vụ trên Linux

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 cho systemctl status, start và stop.
  • LOAD: tệp unit có được phân tích đúng hay không (loaded, not-found, bad-setting, error hoặc masked).
  • ACTIVE: trạng thái tổng quát (active, inactive, activating, deactivating hoặc failed).
  • 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ệnhNội dung hiển thị
systemctl list-units --type=serviceCác dịch vụ đang hoạt động và bị lỗi hiện có trong bộ nhớ
systemctl list-units --type=service --allMọi dịch vụ đã nạp, kể cả dịch vụ không hoạt động
systemctl list-units --type=service --state=runningChỉ các dịch vụ có tiến trình đang chạy
systemctl --failedChỉ các unit bị lỗi: bài kiểm tra sức khỏe hằng ngày
systemctl list-unit-files --type=serviceMọi dịch vụ đã cài và cấu hình khởi động của chúng
systemctl list-unit-files --state=enabledCác unit tự động khởi động khi boot
systemctl status nameChi tiết đầy đủ của một dịch vụ, kèm các dòng log gần đây
systemctl is-active nameTrạng thái một từ cùng mã thoát dễ dùng trong script
systemctl is-enabled nameCấu hình khởi động của một dịch vụ
service --status-allDanh 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)?

Đó là một dịch vụ oneshot đã chạy thành công và kết thúc, không phải lỗi.
Các dịch vụ có 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ì?

Xanh lá nghĩa là đang hoạt động, trắng là không hoạt động, đỏ là bị lỗi hoặc gặp sự cố.
Dấu chấm tròn trước tên unit trong 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?

Có, systemctl list-unit-files --type=service thay thế chkconfig --list.
Trên RHEL và CentOS 7 trở lên, 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?

Dùng systemctl disable để gỡ nó khỏi quá trình boot, hoặc mask để chặn hoàn toàn.
Chạy 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ư.

Đăng ký chương trình đại lý của chúng tôi

Thông tin của bạn

Nếu bạn có bất kỳ câu hỏi nào, liên hệ với chúng tôi tại đây !
Họ và tên(Bắt buộc)
Nhập địa chỉ email của bạn, bạn cần có tài khoản trên manager.rdp.monster !

Công ty của bạn

Nhập địa chỉ website của bạn nếu có
Giải thích ngắn gọn cách bạn sẽ bán dịch vụ cho khách hàng. Ví dụ: trò chuyện với mọi người trên các diễn đàn.

Đến quái vật cũng mê cookie!

Chúng tôi sử dụng cookie để cải thiện trải nghiệm duyệt web của bạn, hiển thị quảng cáo hoặc nội dung phù hợp và phân tích lưu lượng truy cập. Khi nhấn "Chấp nhận", bạn đồng ý với việc chúng tôi sử dụng cookie.