พิมพ์ pids และชื่อของกระบวนการที่สร้างขึ้น


10

จากคำถามที่นี่ OP ต้องการโพลซ้ำ pid ของกระบวนการที่ใช้pidofในเชลล์สคริปต์ แน่นอนว่านี่ไม่มีประสิทธิภาพเนื่องจากกระบวนการใหม่จะต้องเริ่มต้นสำหรับpidofโปรแกรมหลายครั้งต่อวินาที (ฉันไม่รู้ว่านี่เป็นสาเหตุของ CPU spikes ในคำถาม แต่ดูเหมือนว่าจะเป็นไปได้)

โดยปกติแล้วสิ่งรอบตัวในเชลล์สคริปต์คือการทำงานกับโปรแกรมเดี่ยวที่ส่งออกข้อมูลที่คุณต้องการstdoutแล้วทำการประมวลผลข้อความบางอย่างหากจำเป็น ในขณะที่สิ่งนี้เกี่ยวข้องกับโปรแกรมเพิ่มเติมที่จะทำงานพร้อมกัน แต่ก็มีแนวโน้มที่จะมี CPU น้อยลงเนื่องจากกระบวนการใหม่ไม่ได้ถูกสร้างขึ้นอย่างต่อเนื่องเพื่อจุดประสงค์ในการทำโพล

ดังนั้นสำหรับคำถามข้างต้นโซลูชันหนึ่งอาจมีโปรแกรมบางตัวที่แสดงชื่อและ pids ของกระบวนการเมื่อสร้างขึ้น จากนั้นคุณสามารถทำสิ่งที่ชอบ:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

ปัญหานี้คือว่ามันก่อให้เกิดคำถามพื้นฐานมากขึ้นวิธีการพิมพ์ชื่อและกระบวนการสามารถพิมพ์ในขณะที่พวกเขาถูกสร้างขึ้น?

ฉันพบโปรแกรมที่เรียกว่าps-watcherแม้ว่าปัญหาของมันคือมันเป็นเพียงperlสคริปต์ที่ทำงานซ้ำ ๆpsดังนั้นมันจึงไม่สามารถแก้ปัญหาได้ อีกตัวเลือกหนึ่งคือการใช้งานซึ่งอาจจะทำงานหากเข้าสู่ระบบการประมวลผลโดยตรงผ่านทางauditd tail -fทางออกที่ดีที่สุดจะง่ายกว่าและพกพาได้มากกว่านี้ถึงแม้ว่าฉันจะยอมรับauditdโซลูชันถ้าเป็นตัวเลือกที่ดีที่สุด


1
ข้อสังเกตที่น่าสนใจคือ pid ถูกสร้างขึ้นครั้งแรกเป็นสำเนาของกระบวนการสร้าง ( forkหรือตัวแปร) จากนั้นโปรแกรมใหม่จะเริ่มต้นโดยใช้สมาชิกของexecตระกูล ดังนั้นคุณอาจต้องการที่จะเข้าสู่ระบบไม่ได้exec* fork
Derobert

2
วิธีเดียวที่มีประสิทธิภาพแบบพกพาที่ฉันรู้คือใช้บัญชีกระบวนการ Unix ธรรมดาซึ่งจะเขียนบันทึกหลังจากกระบวนการออก ถ้าคุณต้องการที่จะจับกระบวนการที่พวกเขากำลังสร้างหรือดำเนินการคุณอาจต้องการสิ่งที่เฉพาะระบบเช่น Linux auditd, systemtap หรือ dtrace
Mark Plotnick

ดังนั้นสำหรับคำถามข้างต้นโซลูชันหนึ่งอาจมีโปรแกรมบางตัวที่แสดงชื่อและ pids ของกระบวนการเมื่อสร้างขึ้น - ในขณะที่พวกเขากำลังสร้าง? ฟังสิ่งที่คุณคิดว่าเป็นผู้สังเกตการณ์ (นี่คือสิ่งที่พวกเขาเรียกพวกเขาในโลกเว็บเบราว์เซอร์) ฉันสงสัยว่างูใหญ่จะเหมาะกับการทำหน้าที่เป็น "ผู้พิทักษ์ประตู" หรือไม่? ข้อเท็จจริงคือว่า Python สามารถขุดลึกลงไปในการทำงานภายในของระบบ (เช่นdbus)
ไวยากรณ์

1
@syntaxerror DBus อยู่ไกลจากการทำงานภายในของระบบในกรณีนี้ - จริงๆแล้วมันเกี่ยวกับสองระดับเหนือสิ่งที่กล่าวถึงที่นี่
เตอร์

ตกลงในศัพท์แสงของ OSI ระดับที่กล่าวถึงในที่นี้อาจยังต่ำกว่า dbus ฉันยอมรับว่าฉันไม่ได้คิดในเชิงลึกเกี่ยวกับว่าทั้งสองอยู่ในระดับเดียวกันหรือไม่
ไวยากรณ์

คำตอบ:


6

คำตอบเฉพาะสำหรับ Linux:

เครื่องมือ perf ประกอบด้วยexecsnoopที่ทำสิ่งนี้ มันใช้คุณสมบัติเฉพาะของ Linux เช่น ftrace บน Debian มันอยู่ในแพ็คเกจperf-tools-unstable

ตัวอย่างของฉันที่ทำงานman catในเทอร์มินัลอื่น:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

ฉันสงสัยว่ามีวิธีพกพาในการทำเช่นนี้


2

มีทางขวาTMการทำเช่นนี้ขึ้นอยู่กับสิ่งที่ระบบและเคอร์เนลคุณเป็นจริงที่ทำงานบน DTraceควรทำงานบน Solaris, Free / NetBSD และ Linux

สำหรับ Linux โดยเฉพาะคุณสามารถใช้ ftrace (ซึ่งจะต้องมีการเปิดใช้งานในเวลารวบรวม - โดยปกติจะเป็น) หรือเหตุการณ์ proc ผ่าน netlink - ดูคำตอบ SOสำหรับปัญหาสำหรับรายละเอียดเพิ่มเติม (และอย่าลืมโหวตให้คะแนนด้วยคะแนน ~ 30 กับ 0 สำหรับคำตอบที่ยอมรับดูตลก) ผู้ติดตามของชายผู้น่าสงสารอาจถูกนำมาใช้โดยการใช้strace -eexec,fork(แม้ว่าจะมีค่าใช้จ่ายที่ไม่สมเหตุสมผล)

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