Khái niệm daemon được gắn vào các quy trình , không phải các tệp . Vì lý do này, không có ý nghĩa trong việc "tìm daemon trên hệ thống tập tin". Chỉ cần làm cho khái niệm rõ ràng hơn một chút: chương trình là một tệp thực thi (hiển thị trong đầu ra của ls
); một quá trình là một thể hiện của chương trình đó (hiển thị trong đầu ra của ps
).
Bây giờ, nếu chúng ta sử dụng thông tin mà tôi đã đưa ra trong câu trả lời của mình , chúng ta có thể tìm thấy các trình tiện ích đang chạy bằng cách tìm kiếm các quy trình chạy mà không có thiết bị đầu cuối kiểm soát được gắn vào chúng . Điều này có thể được thực hiện khá dễ dàng với ps
:
$ ps -eo 'tty,pid,comm' | grep ^?
Trường tty
đầu ra chứa "?" khi quá trình không có thiết bị đầu cuối kiểm soát.
Vấn đề lớn ở đây xảy ra khi hệ thống của bạn chạy một môi trường đồ họa. Vì các chương trình GUI (tức là Chromium) không được gắn vào thiết bị đầu cuối, chúng cũng xuất hiện trong đầu ra. Trên một hệ thống tiêu chuẩn, nơi root không chạy các chương trình đồ họa, bạn chỉ cần giới hạn danh sách trước đó vào các quy trình của root. Điều này có thể đạt được bằng cách sử dụng ps
' -U
chuyển đổi.
$ ps -U0 -o 'tty,pid,comm' | grep ^?
Tuy nhiên, có hai vấn đề phát sinh ở đây:
- Nếu root đang chạy các chương trình đồ họa, chúng sẽ hiển thị.
- Daemon chạy mà không có quyền root sẽ không. Lưu ý rằng trình nền bắt đầu lúc khởi động thường chạy dưới quyền root.
Về cơ bản, chúng tôi muốn hiển thị tất cả các chương trình mà không có thiết bị đầu cuối kiểm soát, nhưng không phải là chương trình GUI . May mắn thay cho chúng tôi, có một chương trình liệt kê các quy trình GUI : xlsclients
! Câu trả lời này từ slm cho chúng ta biết cách sử dụng nó để liệt kê tất cả các chương trình GUI, nhưng chúng ta sẽ phải đảo ngược nó, vì chúng ta muốn loại trừ chúng. Điều này có thể được thực hiện bằng cách sử dụng --deselect
chuyển đổi.
Trước tiên, chúng tôi sẽ xây dựng một danh sách tất cả các chương trình GUI mà chúng tôi đang chạy các quy trình. Từ câu trả lời tôi vừa liên kết, việc này được thực hiện bằng ...
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
Bây giờ, ps
có một -C
công tắc cho phép chúng ta chọn theo tên lệnh. Chúng ta vừa có danh sách lệnh của mình, vì vậy hãy đưa nó vào ps
dòng lệnh. Lưu ý rằng tôi đang sử dụng --deselect
sau đó để đảo ngược lựa chọn của tôi.
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
Bây giờ, chúng tôi có một danh sách tất cả các quy trình không phải GUI. Chúng ta đừng quên quy tắc "không gắn TTY" của chúng tôi. Đối với điều này, tôi sẽ thêm -o tty,args
vào dòng trước để xuất ra tty
từng quy trình (và dòng lệnh đầy đủ của nó):
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
Cuối cùng grep
nắm bắt tất cả các dòng bắt đầu bằng "?", Nghĩa là, tất cả các quy trình mà không có tty kiểm soát. Và ở đó bạn đi! Dòng cuối cùng này cung cấp cho bạn tất cả các quy trình không phải GUI đang chạy mà không có thiết bị đầu cuối kiểm soát. Lưu ý rằng bạn vẫn có thể cải thiện nó, ví dụ, bằng cách loại trừ các luồng nhân (không xử lý) ...
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
... hoặc bằng cách thêm một vài cột thông tin để bạn đọc:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
network-manager
, khôngNetworkManager
.