Thread file in use
(23 answers)
Opened by mark05 at 2011-01-12 10:05
Da werde ich wohl etwas aus meinem Archiv kramen müssen:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #!/usr/bin/perl use strict; use warnings; use File::Spec; # diese Funktion geht alle Prozess-Verzeichnisse in '/proc' durch # und schaut da in "fd" nach allen geöffneten Dateien (Werden als links abgelegt) # Im Link steht entweder der Pfad zur Datei oder die Pipe-, Socket-, oder Netzwerk ID # es muss ein absoluter Pfad übergeben werden # zurück gegeben wird die Prozess ID, # welche im allgemeinen >0 ist (der Kernel hat die ID 0 öffnen aber selbst keine Dateien) # undef wird zurück gegeben wenn kein Prozess die Datei geöffnet hat sub is_file_opend { my $file=shift; return unless $file; # go throu all processes for my $path (glob('/proc/*')) { next if($path!~m!/(\d+)$!); my $pid=$1; # get all opend files. for my $fref (glob("$path/fd/*")) { my $rfile=readlink($fref); return $pid if($rfile eq $file); } } return undef; } my $file='text.txt'; # testDatei öffnen open(my $fh, '<', $file) or die("ERROR open $file ($!)\n"); # Test mit Ausgabe der Prozessid if(my $pid=is_file_opend(File::Spec->rel2abs($file))) { print "$file is opend by $pid\n"; } else { print "$file is not opend\n"; } # ganz einfacher Test. if(is_file_opend(File::Spec->rel2abs($file))) { print "$file is opend\n"; } else { print "$file is not opend\n"; } close($fh); Das funktioniert auf allen Systemen die sich wie eine Unix verhalten und ein "/proc" Verzeichnis haben. Manchmal muss man es explizit mounten (in embedded Systemen z.B.) |