Bagaimana cara mendaftar semua daemon yang berjalan?

32

Dari pertanyaan saya , jelas bahwa saya tidak dapat dengan mudah memutuskan fitur daemon. Saya telah membaca di artikel yang berbeda dan dari berbagai forum bahwa service --status-allperintah dapat digunakan untuk membuat daftar semua daemon di sistem saya. Tetapi saya tidak berpikir bahwa perintah tersebut mencantumkan semua daemon karena NetworkManager, daemon yang sedang berjalan di Ubuntu 14.04sistem saya , tidak terdaftar oleh perintah. Apakah ada perintah untuk membuat daftar daemon yang sedang berjalan atau ada cara lain untuk menemukan daemon filesystemitu sendiri?

Jackzz
sumber
Apakah Anda yakin itu tidak terdaftar? Bagaimana kabarmu? Saya bisa melihatnya di Debian saya. Perhatikan bahwa namanya network-managerbukan NetworkManager.
terdon
Iya nih. Saya yakin. Tidak ada yang terkait dengan istilah jaringan terdaftar. Juga daftar anacronyang disebutkan bukan daemon dalam skrip initnya.
Jackzz
Anacron bukan menjadi daemon lebih merupakan pertanyaan tentang semantik karena tidak berjalan terus-menerus. Ini masih dijalankan sebagai layanan yang biasanya Anda sebut sebagai daemon. Harap edit pertanyaan Anda dan saya) beri tahu kami Ubuntu mana yang Anda jalankan dan ii) apa yang sebenarnya Anda maksud dengan "daemon". Apa tujuan akhir Anda di sini?
terdon
Saya kira setiap layanan yang berjalan di latar belakang adalah sebuah daemon. Saya sebutkan anacronkarena dikatakan /etc/init.d/anacronbahwa itu bukan daemon. Tujuan saya adalah menulis sebuah C++program untuk mendaftar semua daemon yang berjalan di sistem saya. Untuk itu saya perlu tahu file mana yang harus diurai untuk mendapatkan detailnya.
Jackzz
1
Nah, jika Anda mendefinisikan daemon sebagai layanan, service --status-allitulah yang Anda butuhkan. Ubuntu tampaknya memperlakukan NetworkManager secara berbeda. Saya mendapatkan keduanya networkingdan network-managerdi output services --status-alldi Debian tetapi hanya networkingdi Ubuntu. Saya pikir Anda perlu mendefinisikan apa yang sebenarnya Anda maksud dengan "daemon".
terdon

Jawaban:

52

Gagasan daemon melekat pada proses , bukan file . Untuk alasan ini, tidak ada gunanya "mencari daemon di sistem berkas". Hanya untuk membuat gagasan sedikit lebih jelas: program adalah file yang dapat dieksekusi (terlihat pada output dari ls); sebuah proses adalah turunan dari program itu (terlihat dalam output of ps).

Sekarang, jika kita menggunakan informasi yang saya berikan dalam jawaban saya , kita dapat menemukan daemon yang sedang berjalan dengan mencari proses yang berjalan tanpa terminal pengendali yang melekat padanya . Ini dapat dilakukan dengan cukup mudah dengan ps:

$ ps -eo 'tty,pid,comm' | grep ^?

Kolom ttykeluaran berisi "?" ketika proses tidak memiliki terminal pengendali.

Masalah besar di sini muncul ketika sistem Anda menjalankan lingkungan grafis. Karena program GUI (yaitu Chromium) tidak terpasang ke terminal, mereka juga muncul di output. Pada sistem standar, di mana root tidak menjalankan program grafis, Anda bisa membatasi daftar sebelumnya untuk proses root. Ini dapat dicapai menggunakan ps' -Uswitch.

$ ps -U0 -o 'tty,pid,comm' | grep ^?

Namun, dua masalah muncul di sini:

  • Jika root menjalankan program grafis, mereka akan muncul.
  • Daemon yang berjalan tanpa hak root tidak. Perhatikan bahwa daemon yang dimulai saat boot biasanya berjalan sebagai root.

Pada dasarnya, kami ingin menampilkan semua program tanpa terminal pengendali, tetapi bukan program GUI . Untungnya bagi kita, ada program untuk proses daftar GUI: xlsclients! Jawaban dari slm ini memberi tahu kami cara menggunakannya untuk mendaftar semua program GUI, tetapi kami harus membaliknya, karena kami ingin mengecualikannya. Ini dapat dilakukan dengan menggunakan --deselectsakelar.

Pertama, kami akan membuat daftar semua program GUI yang kami jalankan prosesnya. Dari jawaban yang baru saja saya tautkan, ini dilakukan menggunakan ...

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

Sekarang, psmemiliki -Csaklar yang memungkinkan kita untuk memilih berdasarkan nama perintah. Kami baru saja mendapatkan daftar perintah kami, jadi mari menyuntikkannya ke psbaris perintah. Perhatikan bahwa saya menggunakan --deselectsetelah itu untuk membalikkan pilihan saya.

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

Sekarang, kami memiliki daftar semua proses non-GUI. Jangan lupakan aturan "tanpa TTY kami". Untuk ini, saya akan menambahkan -o tty,argske baris sebelumnya untuk menampilkan ttysetiap proses (dan baris perintah lengkapnya):

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

Final grepmenangkap semua baris yang dimulai dengan "?", Yaitu, semua proses tanpa tty kontrol. Dan begitulah! Baris terakhir ini memberi Anda semua proses non-GUI berjalan tanpa terminal pengendali. Perhatikan bahwa Anda masih bisa memperbaikinya, misalnya, dengan mengecualikan utas kernel (yang bukan proses) ...

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

... atau dengan menambahkan beberapa kolom informasi untuk Anda baca:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
John WH Smith
sumber
linux menyimpan banyak info di sistem file virtual, procfs. jadi itu layak "menemukan daemon di filesystem" !!!
Massimo
0

Saya menulis untuk sysv initd "lama", Anda harus memeriksa apakah itu bekerja pada distro Anda.

Setan yang baik memiliki skrip startup yang ditulis dengan baik di / etc / initd

Saat mengganti runlevel, bagaimana init mengetahui daemon yang berjalan?

Itu mencari nama mereka di direktori

/ var / lock / subsys

Jadi kamu bisa

dapatkan daftar nama dari sana

memindai semua proses yang berjalan dan memeriksa apakah nama itu ada di dalam daftar: bingo!

Untuk memindai semua proses: daftarkan setiap subdirektori di

/ proc

Jika namanya digit, itu adalah pid dari proses yang berjalan.

Misalnya, status proses dengan pid 1234 adalah file ini

/ proc / 1234 / status

Buka dan dapatkan baris pertama, dimulai dengan "Nama:"

Lihat

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

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

(maaf untuk pemformatan yang tidak menyenangkan, saya menulis dari ponsel saya ...)

Massimo
sumber