ฉันจะตรวจสอบไฟล์ที่เปิดของกระบวนการแบบเรียลไทม์ได้อย่างไร


41

ฉันรู้ว่าฉันสามารถดูไฟล์ที่เปิดของกระบวนการที่ใช้lsof ในขณะนั้นในเครื่อง Linux ของฉัน อย่างไรก็ตามกระบวนการสามารถเปิดแก้ไขและปิดไฟล์ได้อย่างรวดเร็วจนฉันไม่สามารถมองเห็นได้เมื่อทำการตรวจสอบโดยใช้เชลล์สคริปต์มาตรฐาน (เช่นwatch) ตามที่อธิบายไว้ใน"การตรวจสอบไฟล์กระบวนการเปิดบน linux (เรียลไทม์)" .

ดังนั้นฉันคิดว่าฉันกำลังมองหาวิธีง่ายๆในการตรวจสอบกระบวนการและดูว่ามันทำอะไรไปบ้างเมื่อเวลาผ่านไป มันจะดีถ้ามันเป็นไปได้ที่จะเห็นว่าการเชื่อมต่อเครือข่ายมัน (พยายามที่จะ) และให้เริ่มต้นการตรวจสอบก่อนที่กระบวนการจะมีเวลาในการทำงานโดยไม่ต้องเริ่มการตรวจสอบ

เป็นการดีที่ฉันต้องการทำสิ่งนี้:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

สิ่งนี้จะเป็นไปได้หรือไม่โดยใช้straceและตั้งค่าสถานะเพื่อไม่เห็นการเรียกระบบทุกครั้ง?


คำตอบ:


49

วิ่งด้วย

strace -e trace=open,close,read,write,connect,accept your-command-here

อาจจะเพียงพอ

คุณจะต้องใช้-oตัวเลือกเพื่อวางเอาต์พุตของ strace ที่อื่นที่ไม่ใช่คอนโซลหากกระบวนการสามารถพิมพ์ไปยัง stderr ได้ หากส้อมกระบวนการของคุณคุณยังจะต้องหรือ-f-ff

Oh, และคุณอาจต้องการ-tเป็นอย่างดีเพื่อให้คุณสามารถเห็นเมื่อโทรที่เกิดขึ้น


หมายเหตุคุณอาจต้องปรับแต่งรายชื่อฟังก์ชั่นการโทรขึ้นอยู่กับกระบวนการของคุณ - ฉันต้องเพิ่มgetdentsตัวอย่างเพื่อให้ได้ตัวอย่างที่ดีขึ้นโดยใช้ls:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
นั่นคือการเข้าสู่ทิศทางที่ถูกต้องขอบคุณ! ต้องการผลลัพธ์ที่เป็นมิตรกับผู้ใช้มากขึ้น แต่ทำงานได้ดี ฉันอาจต้องใช้เวลาในการเขียนเครื่องมือด้วยอินเทอร์เฟซที่เป็นที่นิยมมากกว่านี้ ฉันหวังว่าเครื่องมือที่ใช้ ncurses-based หรือ 'top-like-like จะมีอยู่เพื่อตรวจสอบการกระทำของไบนารีแบบเรียลไทม์
gertvdijk

คุณอยากให้มันเป็นอย่างไร อาจเป็นไปได้ที่จะลบล้างผลลัพธ์ที่ไม่เป็นมิตร
ไร้ประโยชน์

แน่นอนคุณต้องการที่จะใช้-oเพื่อผลักดันการส่งออกไปยังไฟล์ จากนั้นคุณสามารถเรียกใช้tail -F strace.outputในเทอร์มินัลอื่นเพื่อรับการอัปเดต "สด"
เตอร์

4
นอกจากนี้คุณยังสามารถแนบstraceกับกระบวนการทำงานด้วย-p PIDตัวเลือก
Frank Breitling

เพิ่ม-yไปที่ "[p] พา ธ rint ที่เชื่อมโยงกับอาร์กิวเมนต์ file descriptor"
ricab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.