วิธีแสดง daemons ที่ใช้งานอยู่ทั้งหมด


32

จากคำถามของฉันเป็นที่ชัดเจนว่าฉันไม่สามารถตัดสินใจคุณสมบัติของ daemon ได้อย่างง่ายดายฉันได้อ่านบทความต่าง ๆ และจากฟอรัมต่าง ๆ ที่service --status-allสามารถใช้คำสั่งเพื่อแสดงรายการ daemons ทั้งหมดในระบบของฉัน แต่ฉันไม่คิดว่าคำสั่งนั้นแสดงรายการ daemons ทั้งหมดเพราะNetworkManagerdaemon ที่กำลังทำงานอยู่ในUbuntu 14.04ระบบของฉันไม่ได้อยู่ในรายการคำสั่ง มีคำสั่งให้แสดงรายการ daemons ที่กำลังทำงานอยู่หรืออย่างอื่นมีวิธีหา daemons จากfilesystemตัวเองบ้างไหม?


คุณแน่ใจหรือว่าไม่อยู่ในรายการ? คุณเป็นอย่างไรบ้าง ฉันเห็นได้จาก Debian ของฉัน โปรดทราบว่าชื่อไม่ได้network-manager NetworkManager
terdon

ใช่. ฉันแน่ใจ. ไม่มีสิ่งใดที่เกี่ยวข้องกับคำว่าเครือข่าย นอกจากนี้ยังแสดงรายการanacronที่กล่าวถึงว่าไม่ใช่ภูตในสคริปต์เริ่มต้น
Jackzz

Anacron ไม่ได้เป็นดีมอนเป็นคำถามเกี่ยวกับความหมายมากขึ้นเพราะมันไม่ได้ทำงานอย่างต่อเนื่อง มันยังคงทำงานเป็นบริการซึ่งเป็นสิ่งที่คุณปกติจะเรียกว่า daemons โปรดแก้ไขคำถามของคุณและ i) บอกเราว่าคุณกำลังใช้งาน Ubuntu ใดและ ii) "daemon" ที่คุณหมายถึงอะไร อะไรคือเป้าหมายสุดท้ายของคุณที่นี่
terdon

ฉันคิดว่าบริการใด ๆ ที่ทำงานในพื้นหลังเป็นภูต ฉันพูดถึงanacronเพราะมันบอก/etc/init.d/anacronว่ามันไม่ใช่ภูต วัตถุประสงค์ของฉันคือการเขียนC++โปรแกรมเพื่อแสดง daemons ทั้งหมดที่ทำงานในระบบของฉัน เพื่อที่ฉันจะต้องรู้ว่าไฟล์ที่จะแยกเพื่อรับรายละเอียด
Jackzz

1
ดีถ้าคุณกำหนด daemons เป็นบริการservice --status-allเป็นสิ่งที่คุณต้องการ ดูเหมือนว่า Ubuntu จะรักษา NetworkManager แตกต่างกัน ฉันได้รับทั้งสองnetworkingและnetwork-managerผลลัพธ์ของservices --status-allบน Debian แต่เฉพาะnetworkingใน Ubuntu ฉันคิดว่าคุณต้องกำหนดว่าคุณหมายถึงอะไรโดย "daemon"
terdon

คำตอบ:


52

ความคิดของภูตถูกแนบไปกับกระบวนการไม่ไฟล์ ด้วยเหตุผลนี้จึงไม่มีเหตุผลในการ "ค้นหา daemons บนระบบไฟล์" เพียงเพื่อทำให้ความคิดชัดเจนขึ้นเล็กน้อย: โปรแกรมเป็นไฟล์ที่ปฏิบัติการได้ (มองเห็นได้ในผลลัพธ์ของls); กระบวนการเป็นตัวอย่างของโปรแกรมนั้น (มองเห็นได้ในผลลัพธ์ของps)

ตอนนี้ถ้าเราจะใช้ข้อมูลที่ผมให้ในคำตอบของฉัน , เราจะสามารถหาทำงานภูตโดยการค้นหาสำหรับกระบวนการที่ทำงานโดยไม่ต้องมีสถานีควบคุมที่แนบมากับพวกเขา สามารถทำได้ค่อนข้างง่ายด้วยps:

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

ttyข้อมูลการส่งออกมี "?" เมื่อกระบวนการไม่มีเทอร์มินัลการควบคุม

ปัญหาใหญ่ที่นี่เกิดขึ้นเมื่อระบบของคุณใช้สภาพแวดล้อมแบบกราฟิก เนื่องจากโปรแกรม GUI (เช่น Chromium) ไม่ได้เชื่อมต่อกับเทอร์มินัลจึงปรากฏในเอาท์พุท บนระบบมาตรฐานที่รูทไม่ได้รันโปรแกรมกราฟิกคุณสามารถ จำกัด รายการก่อนหน้านี้ให้กับกระบวนการของรูทได้ สามารถทำได้โดยใช้ps' -Uสวิตช์

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

แต่ปัญหาสองประการเกิดขึ้นที่นี่:

  • หากรูทรันโปรแกรมกราฟิกพวกเขาจะปรากฏขึ้น
  • Daemons ที่ทำงานโดยไม่มีสิทธิ์รูทจะไม่ทำเช่นนั้น โปรดทราบว่า daemons ที่เริ่มต้นในเวลาบูตมักจะทำงานเป็นรูท

โดยทั่วไปเราอยากจะแสดงโปรแกรมทั้งหมดโดยไม่ต้องมีสถานีควบคุม แต่ไม่โปรแกรม โชคดีที่เรามีโปรแกรมกระบวนการรายการแบบ GUI xlsclients! คำตอบจาก slm นี้บอกเราถึงวิธีการใช้เพื่อแสดงรายการโปรแกรม GUI ทั้งหมด แต่เราจะต้องย้อนกลับเนื่องจากเราต้องการแยกพวกเขาออก สามารถทำได้โดยใช้--deselectสวิตช์

อันดับแรกเราจะสร้างรายการโปรแกรม GUI ทั้งหมดที่เรามีกระบวนการทำงานอยู่ จากคำตอบที่ฉันเพิ่งเชื่อมโยงจะดำเนินการโดยใช้ ...

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

ตอนนี้psมี-Cสวิตช์ที่อนุญาตให้เราเลือกตามชื่อคำสั่ง เราเพิ่งได้รายการคำสั่งของเราดังนั้นเราจะแทรกมันเข้าไปในpsบรรทัดคำสั่ง โปรดทราบว่าฉันใช้ใน--deselectภายหลังเพื่อย้อนกลับการเลือกของฉัน

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

ตอนนี้เรามีรายการกระบวนการที่ไม่ใช่ GUI ทั้งหมด อย่าลืมกฎ "no TTY ที่แนบมา" ของเรา สำหรับสิ่งนี้ฉันจะเพิ่ม-o tty,argsในบรรทัดก่อนหน้าเพื่อส่งออกttyของแต่ละกระบวนการ (และบรรทัดคำสั่งเต็ม)

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

สุดท้ายgrepจับทุกบรรทัดที่ขึ้นต้นด้วย "?" นั่นคือกระบวนการทั้งหมดโดยไม่มีการควบคุม tty และไปที่นั่น! บรรทัดสุดท้ายนี้ให้กระบวนการที่ไม่ใช่ GUI ทั้งหมดให้คุณทำงานโดยไม่มีสถานีควบคุม โปรดทราบว่าคุณยังคงสามารถปรับปรุงได้เช่นโดยไม่รวมเธรดเคอร์เนล (ซึ่งไม่ใช่กระบวนการ) ...

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

... หรือโดยการเพิ่มคอลัมน์ข้อมูลให้คุณอ่าน:

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

linux เก็บข้อมูลมากมายบนระบบไฟล์เสมือน procfs ดังนั้นจึงเป็นไปได้ "ค้นหา daemons บนระบบแฟ้ม" !!!
Massimo

0

ฉันเขียนสำหรับ sysv "เก่า" initd คุณต้องตรวจสอบว่ามันทำงานบน distro ของคุณหรือไม่

ปีศาจดีมีสคริปต์เริ่มต้นที่เขียนได้ดีใน / etc / initd

เมื่อเปลี่ยน runlevel แล้ว init จะรู้ daemons ที่กำลังทำงานอยู่ได้อย่างไร

ค้นหาชื่อในไดเรกทอรี

/ var / lock / subsys

คุณสามารถ

รับรายชื่อจากที่นั่น

สแกนกระบวนการทำงานทั้งหมดและตรวจสอบว่าชื่ออยู่ในรายการ: bingo!

ในการสแกนกระบวนการทั้งหมด: ทำรายการทุกไดเรกทอรีย่อย

proc /

หากชื่อของมันคือตัวเลขมันเป็น pid ของกระบวนการที่กำลังทำงานอยู่

ตัวอย่างเช่นสถานะของกระบวนการที่มี pid 1234 คือไฟล์นี้

/ proc / 1234 / สถานะ

เปิดและรับบรรทัดแรกเริ่มต้นด้วย "ชื่อ:"

ดู

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

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

(ขออภัยสำหรับการจัดรูปแบบที่น่ารังเกียจฉันกำลังเขียนจากโทรศัพท์มือถือของฉัน ... )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.