Làm thế nào để kiểm tra xem một quá trình có phải là daemon hay không?


7

Tôi đã viết một trình nền nhỏ bắt đầu vào thời điểm khởi động và thực hiện tất cả những điều hoàn hảo như viết trong tệp nhật ký. Nhưng tôi muốn biết, làm thế nào chúng ta có thể kiểm tra xem quá trình đó có phải là daemon hay không? Giáo sư của tôi nói với tôi về một lệnh ps -xj | grep daemon(tên tệp của tôi là daemon), nhưng tôi không bị thuyết phục về điều đó vì nó hiển thị thông tin không mong muốn. Có bất kỳ lệnh shell cho điều đó?

chỉnh sửa: Tôi đang sử dụng Ubuntu 14.04 LTS

Câu trả lời:


10

Bất cứ điều gì với PPID của 1, phần lớn, có khả năng là một daemon. Nhưng có những tình huống có thể phát sinh trong đó các quá trình có thể trở thành con của 1 mà không phải là daemon kỹ thuật. Vì vậy, các phương pháp tôi thảo luận dưới đây là để chứng minh cách bạn xác định xem liệu PID có thuộc sở hữu của 1 hay không, không nhất thiết phải là daemon thực tế.

Ví dụ

$ ps -xj
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 8420  1211  1211  8420 pts/4     1211 S+    1000   0:01 ssh dufresne
    1  2276  2275  2275 ?           -1 Sl    1000   0:48 /usr/bin/gnome-keyring-daemon --daemonize --login
 2196  2278  2278  2278 ?           -1 Ssl   1000   0:39 gnome-session
    1  2288  2278  2278 ?           -1 S     1000   0:00 dbus-launch --sh-syntax --exit-with-session
    1  2289  2289  2289 ?           -1 Ssl   1000   6:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
    1  2358  2289  2289 ?           -1 Sl    1000   0:01 /usr/libexec/gvfsd

Đoạn trích từ Wikipedia cũng có thể làm sáng tỏ mọi thứ, nhưng nó cũng khiến mọi thứ hơi mơ hồ về cách thực sự xác định xem một quy trình có phải là daemon hay không.

trích từ Wikipedia

Trong môi trường Unix, quy trình cha của daemon thường, nhưng không phải lúc nào cũng là quy trình init. Một daemon thường được tạo ra bởi một quá trình tạo ra một tiến trình con và sau đó thoát ra ngay lập tức, do đó làm cho init chấp nhận tiến trình con hoặc bởi quá trình init trực tiếp khởi chạy daemon. Ngoài ra, một trình nền được khởi chạy bằng cách rẽ và thoát thường phải thực hiện các hoạt động khác, chẳng hạn như phân tách quá trình từ bất kỳ thiết bị đầu cuối kiểm soát nào (tty). Các thủ tục như vậy thường được thực hiện trong các thói quen tiện lợi khác nhau như daemon (3) trong Unix.

LƯU Ý: trên các hệ thống sử dụng SystemD (các bản phân phối Red Hat như Fedora) thường không có initquy trình nào thay vào đó:

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 20

Đó là quá trình với PID 1.

Trên hệ thống Debian / Ubuntu, họ sẽ có một quy trình vẫn được đặt tên init:

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:02 /sbin/init

Vậy daemon là gì?

Và đây là lý do có thể khó để xác định xem có thứ gì đó là daemon hay không khi PPID của nó là 1:

Một quy trình có thể trở thành con của quy trình init, ( LƯU Ý:init quy trình đó là PID 1), khi cha mẹ của chúng bị giết hoặc từ chối chúng, các quy trình này không nhất thiết là daemon, nhưng vẫn sẽ hiển thị là có PPID bằng 1 .

Vì vậy, để đưa ra quyết định liệu thứ gì đó có phải là daemon hay không có khả năng sẽ yêu cầu pin thử nghiệm, và không chỉ đơn giản là xem liệu PPID có phải là 1 hay không.

Vì vậy, nơi mà để lại cho chúng tôi?

Để xác định xem thứ gì đó có phải là daemon hay không, bạn có thể phải dùng đến nhiều thử nghiệm khác nhau, chẳng hạn như:

  • PPID 1?
  • Có TTY kèm theo?
  • Có phải là một dịch vụ? sudo service ...?
  • Nó được quản lý bởi Systemd, Upstart hay SysV?
  • Có phải nó đang nghe trên một cổng?
  • Có phải nó đang ghi vào một tệp nhật ký? Syslog?

Vì vậy, chúng ta phải dùng đến "gõ vịt" nếu nó quẫy và bơi, đó có thể là một con vịt, nhưng ngay cả những đặc điểm trên cũng có thể đánh lừa bạn.

Người giới thiệu


Như bạn đã trích dẫn: "Ngoài ra, một trình nền được khởi chạy bằng cách rẽ và thoát thường phải thực hiện các hoạt động khác, chẳng hạn như phân tách quá trình từ bất kỳ thiết bị đầu cuối kiểm soát nào (tty)." Tôi bao gồm thiếu TTY kiểm soát trong tiêu chí tìm kiếm của mình, ví dụ: phiên ssh được sửa lại thành init khi sshd được khởi động lại.
Simon Richter

@SimonRichter - Điểm tốt. Đã thêm một đoạn về điều này quá.
slm

4
Có ppid = 1 không phải là một chỉ số đáng tin cậy để trở thành một daemon. Rất nhiều quá trình không phải daemon đã sống sót sau paren của họ. Ngược lại, một số quy trình trình nền có chương trình giám sát hoặc quy trình khác của trình nền giống như cha mẹ của chúng.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - Tôi đã chuyển A này ra khỏi âm thanh kỳ dị đến mức PPID = 1 là một chỉ báo tốt về việc trở thành một daemon. LMK những gì bạn nghĩ.
slm

Hầu hết mọi thứ với PPID là 1, phần lớn, có khả năng daemon là sai về cơ bản. Ví dụ: cấu hình trình quản lý cửa sổ của tôi có xu hướng tăng gấp đôi khi khởi chạy chương trình, vì vậy tôi có rất nhiều ứng dụng X có PPID là 1. Converse thực sự hoạt động tốt hơn trên máy của tôi, nhưng đó là vì máy tính để bàn không có xu hướng chạy các quy trình trình nền được giám sát - trên máy chủ, bạn có thể tìm thấy nhiều trình nền có PPID là quy trình giám sát.
Gilles 'SO- ngừng trở thành ác quỷ'

6

Không có cách nào để phân biệt một quy trình thông thường từ một quy trình daemon. Một daemon có thể được bắt đầu từ bất cứ đâu, không chỉ init. Không cần thiết phải tăng gấp đôi ngã ba và tách khỏi thiết bị đầu cuối để được coi là một daemon.

Trên các hệ thống Gnome, gnome-settings-daemon giữ cha mẹ của nó, ghi nhật ký vào thiết bị đầu cuối của cha mẹ và không có PID1 như là cha mẹ của nó, nhưng nó vẫn được coi là một daemon.

Một daemon chỉ đơn giản là một quá trình chạy liên tục. Do đó, chúng không thể xác định bằng một lệnh.

Bây giờ, nếu những gì bạn muốn là để biết nếu daemon cụ thể của bạn đang chạy, thì hãy tham gia vào pgreplệnh.

Ngoài ra, thay đổi tên của daemon của bạn, đã có một lệnh được gọi là daemon mà cuối cùng bạn có thể xung đột với.


Đúng. Tôi nghĩ rằng pid của daemon không phải lúc nào cũng là một vì khi tôi viết daemon đầu tiên của tôi, nó không được đính kèm với quy trình pid 1. Cảm ơn bạn.
Pranjal

3
không có TTY kèm theo nên được coi là có mối tương quan mạnh (có thể lớn hơn nhiều so với PPID 1) với việc là một daemon.
vaab

Có, nhưng không có quy trình nào có thể không có thiết bị đầu cuối kèm theo (ví dụ: công việc định kỳ).
CameronNemo
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.