ความคิดของภูตถูกแนบไปกับกระบวนการไม่ไฟล์ ด้วยเหตุผลนี้จึงไม่มีเหตุผลในการ "ค้นหา 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 ^?
network-manager
NetworkManager