lsof ile dosyayı kontrol eden perl parçası şöyle birşey olabilir;
my $fileName = "/tmp/a";
my $lsof = `lsof -w | grep $filename`;
if($lsof =~ $fileName){
    die("$fileName is opened by another process.");
}else{
    // process
}

gönderdiğiniz kodda bu kontrolü yapacağınız yer ise sanırım;
   if  (not $filecount) {
            logit("Nothing to do");
            sleep $delay;
            next;
    }

bloğunun altı olabilir.

örnekteki die satırı yerine sleep "$delay;next;" ekleyip else bloğunu
kaldırırsanız işinizi görecektir.

kolay gelsin..

26 Ekim 2011 16:39 tarihinde Akın Temel <[email protected]> yazdı:
> Mailiniz için çok teşekür ederim.
> Perl konusunda çok yeni olduğum için sizden ricam aşağıdaki kodda bu işlemi
> nasıl yapacağımı kısca belirtirsebiz senirim.Sciript bir dizin içerisini her
> dakikada kontrol edeiyor yeni bir dosya bulduğu zaman onu ftp ile başka bir
> yere kopyalıyor.Tabi bu durum dosya oluşturulurken çalışma ihtimali olduğu
> için ( ki oldu ) dosyayı atmaya başladığ için eksik atmış oldu.Sizin
> dediğiniz şelikde lsof komut bloğunu nerde yazmalıyım.
> ---------------------------------------------------------------------------------
> #!/usr/bin/perl
> use strict;
> use Net::FTP;
> #use File::Copy;
> #
> # Following variables are needed
> my $directory="/ftpdir";
> my $logfile="/var/log/xxftp.log";
> my $destination="xx.xx.xx.xx";
> my $login="test";
> my $password="test!2011";
> my $putdir="/FTP/akin/";
> my $delay=60;
> #
> # program starts here
> #
> my $ftp;
> my $newerr;
> my @files;
> my $file;
> my $filecount;
> my $line;
> my $date;
> chdir($directory) or die("$! Can't cd to $directory");
> while (1)  {
>    @files=();
>    $newerr=0;
>    logit("Starting new loop");
>    foreach(<*>) {
>           push @files,$_
>    }
>    my $filecount=@files;
>    logit("$filecount files to transfer");
>    if  (not $filecount) {
>             logit("Nothing to do");
>             sleep $delay;
>             next;
>     }
>     $ftp=Net::FTP->new($destination,Timeout=>240) or $newerr=1;
>         if ($newerr) {
>              logit("Can't connect to $destination");
>       sleep $delay;
>              next;
>         }
>    $ftp->login("$login","$password") or $newerr=1;
>         if ($newerr) {
>           logit("Can't login  $destination with $login,$password");
>          $ftp->quit;
>          sleep $delay;
>          next;
>         }
>
>    $ftp->binary(); # set binary mode
>    $ftp->cwd($putdir) or $newerr=1;
>         if ($newerr) {
>           logit("Can't cd to $putdir on  $destination");
>           $ftp->quit;
>           sleep $delay;
>           next;
>         }
>    foreach(@files) {
>       $file=$_;
>       $newerr=0;
>       $ftp->put($file,$file) or $newerr=1;
>      if ($newerr) {
>         logit("Error transferring $file");
>         next;
>    }
>    unlink($file) or logit("$! can't unlink $file");;
>         }
> # delay for next loop
> sleep $delay;
> }
> sub logit {
>   $line=shift;
>   $date=localtime(time);
>   open(LOG,">>$logfile") or die("$! Can't open $logfile");
>   print LOG "$date: $file @files $line\n";
>   print "$date: $file @files $line\n";
>   close LOG;
> }
> --------------------------------------------------------------------------------------
>
>
>
>
> 2011/10/26 Devrim GÜNDÜZ <[email protected]>
>>
>> On Wed, 2011-10-26 at 16:06 +0300, Akın Temel wrote:
>> >
>> >
>> > Kopyalanan dosyanın kopyalama işleminin bittiğini kotrol ederek başka
>> > bi dizine kopyalama işlemini nasıl yapabilirim.
>>
>> Perl'de nasıl yapılır bilmiyorum, ama bash'de $? ile çıkış kodunu
>> kontrol edebilirsiniz. Örneğin,
>>
>> if [ $? != 0 ]
>> then
>>        echo "Kopyalama başarısız oldu!"
>>        exit 1
>> fi
>>
>> gibi birşey. Perl için de ipucu verir belki.
>> --
>> Devrim GÜNDÜZ
>> Principal Systems Engineer @ EnterpriseDB: http://www.enterprisedb.com
>> PostgreSQL Danışmanı/Consultant, Red Hat Certified Engineer
>> Community: devrim~PostgreSQL.org, devrim.gunduz~linux.org.tr
>> http://www.gunduz.org  Twitter: http://twitter.com/devrimgunduz
>>
>> _______________________________________________
>> Linux-sunucu E-Posta Listesi
>> [email protected]
>>
>> Liste kurallarını http://liste.linux.org.tr/kurallar.php  bağlantısından
>> okuyabilirsiniz;
>>
>> Bu Listede neden bulunduğunuzu bilmiyorsanız veya artık bu listeden gelen
>> e-postaları almak istemiyorsanız aşağıdaki bağlantı adresini kullanarak 1
>> dakika içinde üyeliğinizi sonlandırabilirsiniz.
>> https://liste.linux.org.tr/mailman/listinfo/linux-sunucu
>>
>
>
> _______________________________________________
> Linux-sunucu E-Posta Listesi
> [email protected]
>
> Liste kurallarını http://liste.linux.org.tr/kurallar.php  bağlantısından
> okuyabilirsiniz;
>
> Bu Listede neden bulunduğunuzu bilmiyorsanız veya artık bu listeden gelen
> e-postaları almak istemiyorsanız aşağıdaki bağlantı adresini kullanarak 1
> dakika içinde üyeliğinizi sonlandırabilirsiniz.
> https://liste.linux.org.tr/mailman/listinfo/linux-sunucu
>
>
_______________________________________________
Linux-sunucu E-Posta Listesi
[email protected]

Liste kurallarını http://liste.linux.org.tr/kurallar.php  bağlantısından 
okuyabilirsiniz;

Bu Listede neden bulunduğunuzu bilmiyorsanız veya artık bu listeden gelen 
e-postaları almak istemiyorsanız aşağıdaki bağlantı adresini kullanarak 1 
dakika içinde üyeliğinizi sonlandırabilirsiniz.
https://liste.linux.org.tr/mailman/listinfo/linux-sunucu

Cevap