ฉันจะเข้าสู่ระบบไฟล์อ่าน / เขียนโดยชื่อไฟล์ใน Linux ได้อย่างไร


17

ฉันกำลังมองหาวิธีการง่ายๆที่จะบันทึกการทำงานของระบบไฟล์ ควรแสดงชื่อของไฟล์ที่กำลังเข้าถึงหรือแก้ไข

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

บางส่วนของการค้นพบของฉัน:

powertop : ดีที่สุดสำหรับการบันทึกการเข้าถึงการเขียน แต่มุ่งเน้นที่กิจกรรม CPU
iotop : แสดงการเข้าถึงดิสก์แบบเรียลไทม์ตามกระบวนการ แต่ไม่ใช่ชื่อไฟล์
lsof : แสดงไฟล์ที่เปิดต่อกระบวนการ แต่ไม่ใช่เรียลไทม์การเข้าถึงไฟล์
iostat : แสดงเวลาจริง / O ประสิทธิภาพของดิสก์ / อาร์เรย์ แต่ไม่ได้ระบุไฟล์หรือกระบวนการ

คำตอบ:


17

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

iotop -bktoqqq -d .5

where: -b     is batch mode
       -k     is kilobytes/s
       -t     adds timestamp
       -o     only show processes or threads actually doing I/O
       -qqq   removes output headers
       -d .5  updates every .5 seconds

แม้คุณจะสังเกตเห็นว่ากระบวนการจะเข้าถึงดิสก์ วิธีง่ายๆในการตรวจสอบคือหยุดกระบวนการและเริ่มต้นด้วย strace ตัวอย่างเช่น:

sudo strace -f nmbd -D

นี่จะแสดง syscalls ของการเข้าถึงระบบไฟล์

ตัวเลือกอื่นคือinotify (7)ซึ่งมีการแจกแจงจำนวนมากให้ "inotify-tools" เพื่อให้คุณสามารถดูเส้นทางผ่าน

inotifywait -r -mpath_you_want_to_watch


1
fanotifyเป็นเฟรมเวิร์กการแจ้งเตือนระบบไฟล์ใหม่ในเคอร์เนล Linux (เพิ่งเพิ่มรอบปี 2012) คุณอาจต้องการตรวจสอบว่า เครื่องมือและยูทิลิตี้ที่ใช้ยังคงถูกเขียนอยู่ดังนั้นคุณอาจต้องเขียนด้วยตัวเอง แต่มันมีประสิทธิภาพมากกว่าการ inotify, famin หรือสิ่งอื่น ๆ ที่คุณอาจเคยเห็นมาก่อน
allquixotic

3
ค้นหา Google อย่างรวดเร็วสำหรับการแสดง fanotify เครื่องมือที่เรียกว่าfatraceจากที่นี่
Thanh DK

อะไรอยู่nmbdในstraceคำสั่งที่กำหนด?
dragosrsupercool

9

ตัวเลือกอื่นคือhttp://linux.die.net/man/7/inotifyที่มีดิสทริบิวชันมากมายให้ "inotify-tools" เพื่อให้คุณสามารถดูเส้นทางผ่าน

inotifywait -r -m /<path you want to watch>

+1 « inotifywait รอการเปลี่ยนแปลงไฟล์อย่างมีประสิทธิภาพโดยใช้อินเตอร์เฟส inotify (7) ของ Linux »ช่วยในการตรวจสอบเมล็ดละเอียดอย่างยิ่งโดยแสดงการเข้าถึงและการปรับเปลี่ยน <file> ใด ๆ ในเส้นทางที่ตรวจสอบ
tuk0z

3

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


2

สำหรับการบันทึก (แทนที่จะเป็นการตรวจสอบ) คุณควรพิจารณาใช้daemon การตรวจสอบ Linux ที่แนะนำในเคอร์เนล 2.6


ฉันไม่สามารถใช้ PID Watcher ให้ทำงานได้ดังนั้นจึงไม่มีประโยชน์ถ้าคุณไม่รู้ว่าจะดูไฟล์อะไรดี
cmcginty

-3
#!/usr/bin/perl
use Cwd;
use File::Touch;
use File::Temp qw/tempfile/;
use Time::HiRes qw/sleep time alarm/;
use Term::ReadKey;
my ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
if($hchar < 10) {print "please increase window size"; exit; }
my $mydir = getcwd;
my  ($fh, $tmpfile) = tempfile(UNLINK => 1);

while(1)
   {
   my $starttime = time;
   eval {
        local $SIG{ALRM} = sub { die "alarm\n" };
        alarm 0.4;
        $query = `find -neweraa $tmpfile 2>&1`; #change to mm for writes only
        touch($tmpfile);
        @files = split(/\n/,$query);
        alarm 0;
        };
   system('clear');
   foreach $file(@files) { $filecount{$file}++; }
   @sorted = sort {$filecount{$b} <=> $filecount{$a}} (keys %filecount);
   for ($x = 0;$x < $hchar-2; $x++) {print $filecount{$sorted[$x]}."\t".$sorted[$x]."\n";}
   my $endtime = time;
   my $length = ($endtime-$starttime);
   if ($length > 0.3) {print "program not designed for large trees, please use smaller tree.\n"; exit;}
   print "\n$length"."s\n"
   }

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