Làm thế nào để liệt kê tất cả các daemon đang chạy?


32

Từ câu hỏi của tôi , rõ ràng là tôi không thể dễ dàng quyết định các tính năng của daemon. Tôi đã đọc trong các bài viết khác nhau và từ các diễn đàn khác nhau mà service --status-alllệnh có thể được sử dụng để liệt kê tất cả các trình tiện ích trong hệ thống của tôi. Nhưng tôi không nghĩ rằng lệnh đang liệt kê tất cả các trình tiện ích bởi vì NetworkManager, một trình nền hiện đang chạy trong Ubuntu 14.04hệ thống của tôi , không được liệt kê bởi lệnh. Có một số lệnh để liệt kê các trình tiện ích đang chạy hoặc có cách nào khác để tìm các trình tiện ích từ filesystemchính nó không?


Bạn có chắc là nó không được liệt kê? Bạn đang kiểm tra như thế nào? Tôi có thể thấy nó trên Debian của tôi. Lưu ý rằng tên là network-manager, không NetworkManager.
terdon

Vâng. Tôi chắc chắn. Không có gì liên quan đến mạng hạn được liệt kê. Ngoài ra, nó liệt kê anacronmà không được đề cập đến không phải là một daemon trong tập lệnh init của nó.
Jackzz

Anacron không phải là một daemon là một câu hỏi về ngữ nghĩa bởi vì nó không được chạy liên tục. Nó vẫn được chạy như một dịch vụ mà bạn thường gọi là daemon. Vui lòng chỉnh sửa câu hỏi của bạn và tôi) cho chúng tôi biết Ubuntu bạn đang chạy và ii) chính xác ý bạn là gì bởi "daemon". Mục tiêu cuối cùng của bạn ở đây là gì?
terdon

Tôi cho rằng bất kỳ dịch vụ nào chạy trong nền là một daemon. Tôi đã đề cập anacronbởi vì người ta nói /etc/init.d/anacronrằng nó không phải là daemon. Mục tiêu của tôi là viết một C++chương trình để liệt kê tất cả các trình tiện ích đang chạy trong hệ thống của tôi. Cho rằng tôi cần phải biết các tập tin phân tích để có được các chi tiết.
Jackzz

1
Chà, nếu bạn định nghĩa daemon là dịch vụ, service --status-alllà thứ bạn cần. Ubuntu dường như đối xử với NetworkManager khác nhau. Tôi nhận được cả networkingnetwork-managertrong đầu ra của services --status-allDebian nhưng chỉ networkingtrên Ubuntu. Tôi nghĩ bạn cần xác định chính xác ý của bạn là "daemon".
terdon

Câu trả lời:


52

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' -Uchuyể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 --deselectchuyể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ờ, pscó một -Ccô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 psdòng lệnh. Lưu ý rằng tôi đang sử dụng --deselectsau đó để đả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,argsvào dòng trước để xuất ra ttytừ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 grepnắ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 ^?

linux giữ nhiều thông tin trên một hệ thống tập tin ảo, Procfs. vì vậy việc "tìm daemon trên hệ thống tập tin" là khả thi !!!
Massimo

0

Tôi đã viết cho init sysv "cũ", bạn phải kiểm tra xem nó có hoạt động trên bản phân phối của bạn không.

Những con quỷ tốt có các kịch bản khởi động được viết tốt trong / etc / initd

Khi thay đổi runlevel, làm thế nào để init biết các trình nền đang chạy?

Nó tìm tên của họ trong thư mục

/ var / lock / subsys

Vì vậy bạn có thể

lấy danh sách tên từ đó

quét tất cả các quy trình đang chạy và kiểm tra xem tên có trong danh sách không: bingo!

Để quét tất cả các quy trình: liệt kê mọi thư mục con trong

/ Proc

Nếu tên của nó là chữ số, nó là mấu chốt của một quá trình đang chạy.

Ví dụ: trạng thái của quá trình với pid 1234 là tệp này

/ Proc / 1234 / trạng thái

Mở nó và nhận dòng đầu tiên, bắt đầu với "Tên:"

Xem

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subystem-lock-files-in-init-script/

(xin lỗi vì định dạng khó chịu, tôi đang viết từ điện thoại di động của mình ...)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.