Leser: 27
my $bytesize = -s $_;
2011-01-12T09:05:56 mark05wie kann ich mit perl board mitteln erkennen ob eine datei die gerade in ein z.b. verzeichnis kopiert wird noch nicht volstaendig ist?
2011-01-12T09:32:11 mark05diese volstaendigt vorhanden
cp film.mpg /tmp
perl -e 'my @st = stat "/tmp/film.mpg"; print "$st[10]\n";'
2011-01-12T11:57:04 mark05aber
nicht wenn ich das im programm mache.
1 2 3 4 5 6 7 8 9
my $file='/tmp/test.txt'; if(system(qq(lsof '$file' > /dev/null))==0) { print "File $file opend!\n"; } else { print "File $file closed!\n"; }
2011-01-12T12:16:09 topegFür so was wurde "lsof" geschrieben.
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
sub filestat { my $shelf=$_[0]; my $args=$_[1]; my $file=\$args->{file}; my returnrc='inuse'; my $loops=3; my $z=0; my @st = stat ${$file}; my $aktulleinodetime=$stat[10]; @st = (); while ($loops >= $z) { @st = stat ${$file}; my $neueinodetime=$stat[10]; if ($aktuelleinodetime == $neueinodetime) { $returnrc=$aktuelleinodetime; } else { $aktuelleinodetime = $neueinodetime; } $z++; } return $returnrc; }
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);
perl -e 'use Filewatch; my $fw=Filewatch->new({filesync=>'true',}); $fw->fw_add({file=>"/home/glaess/test",}); while (sleep 1) { my @rc = $fw->fw_check (); foreach my $r (@rc) { print "$r\n"; } }'
perl -e 'use Filewatch; my $fw=Filewatch->new(); $fw->fw_add({file=>"/home/glaess/test",}); while (sleep 1) { my @rc = $fw->fw_check (); foreach my $r (@rc) { print "$r\n"; } }'
2011-02-07T13:50:37 mark05ich will noch das so umbauen das Filewatch startet , wenn
das modul nicht installiert ist.
1 2 3
my $modul = 1; eval "use MODUL::NAME; 1;" or $modul = 0; if ($modul) { Modul vorhanden }
2011-02-07T13:58:15 biancaZur Abfrage auf ein Modul hatten wir hier im Forum vor einiger Zeit mal das hier als Optimallösung erarbeitet:
Code (perl): (dl )1 2 3my $modul = 1; eval "use MODUL::NAME; 1;" or $modul = 0; if ($modul) { Modul vorhanden }