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ó init
quy 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