วิธีค้นหาว่าไฟล์ใดถูกเขียนโดยกระบวนการ


9

สถานการณ์ของฉันคือบางครั้งกระบวนการเฉพาะ (ในกรณีนี้คือธันเดอร์เบิร์ด) ไม่ตอบสนองต่อการป้อนข้อมูลของผู้ใช้เป็นเวลาหนึ่งนาที ฉันพบว่าการใช้iotopในช่วงเวลานี้มันเขียนลงดิสก์เยอะมากและตอนนี้ฉันต้องการค้นหาไฟล์ที่เขียน แต่น่าเสียดายที่iotopให้สถิติต่อกระบวนการเท่านั้นและไม่ใช่ต่อไฟล์ที่เปิด (-descriptor)

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

ปัญหาเกิดขึ้นแบบสุ่มเท่านั้นและอาจต้องใช้เวลาสักครู่จึงจะปรากฏดังนั้นฉันหวังว่าฉันจะไม่ต้องไล่ทันเดอร์เบิร์ดเบิร์ดและลุยผ่านท่อนยาวเพื่อค้นหาว่าไฟล์ใดมีการเขียนมากที่สุด


คำตอบ:


6

หากคุณแนบ strace กับกระบวนการเมื่อหยุดทำงาน (คุณสามารถรับ pid และจัดคิวคำสั่งล่วงหน้าในเทอร์มินัลสำรอง) มันจะแสดงไฟล์ descriptor ของการเขียนบล็อก

ตัวอย่างเล็กน้อย:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

ขอบคุณฉันไม่รู้ว่าฉันสามารถแนบ strace ได้ในขณะที่กระบวนการกำลังทำงานอยู่ ฉันจะลองสิ่งนี้
Philipp Wendler

1
คุณสามารถข้ามข้อมูลนี้ได้lsof -p $PIDเพื่อทราบว่าจุดให้คำอธิบายไฟล์อยู่ที่ใด
Coren

1
หรือls -l /proc/pid/fdบน Linux
ไร้ประโยชน์

การใช้สเตรซฉันสามารถค้นหาสิ่งที่ฉันอยากรู้ได้จริงขอบคุณจริงๆอีกครั้ง!
Philipp Wendler

2

ฉันคุณได้เข้าถึงรากผมคิดว่าเครื่องมือที่ดีที่สุดที่จะเป็นระบบย่อยการตรวจสอบ มีวรรณกรรมไม่มากเกี่ยวกับเรื่องนี้ (แต่มากกว่าเกี่ยวกับการบันทึก); คุณสามารถเริ่มต้นด้วยการกวดวิชานี้หรือไม่กี่ตัวอย่างหรือเพียงแค่กับหน้าคน ที่นี่ควรจะเพียงพอเพื่อให้แน่ใจว่า daemon เริ่มต้นจากนั้นเรียกใช้เป็นรูท: auditctlauditctl

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

นี้จะเขียนถึงบันทึกใน/var/log/audit/audit.logทุกครั้งที่กระบวนการด้วย pid 1234 /home/philippเขียนที่ไหนสักแห่งภายใต้ ค่าใช้จ่ายค่อนข้างเล็กและเล็กกว่าstraceมาก


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

@PhilippWendler Ah อืมม ลองเพิ่ม-S read -S write(ยังไม่ทดลอง)
Gilles 'หยุดความชั่วร้าย' Gilles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.