2017-08-17 5 views
1

これは、私が一言で言った最も奇妙なファイルシステム関連の問題です。テキストファイルがPerlでcifsのマウントポイントに不完全に移動しました

I have a scriptは、基本的にリモートのIMAPサーバーに接続し、電子メールをダウンロードし、読み取り、rip-offゴミ箱にして.txt.xmlファイルのみをダウンロードします。 .txtの場合Text::Unaccentを使用してアクセントを削除してください。

これは、imapリモートフォルダとこのサーバのローカルcifsマウントフォルダとの1対1の関係で行われます。 imapのダウンロードとアクセント除去の処理はうまく動作します。

私の問題は、ファイルをダウンロードしてアクセントを処理し、cifsマウントされたディレクトリに移動すると、ファイルがリッピングされてしまいます(最後の4〜10Kが欠落しています)。同じマシンのanoterパーティションに移動すると、ファイルは正常な方法で移動されます(同じmd5sum、同じファイルサイズ、変更された変更はdiff)。

アクセント削除し、ファイルに移動するコードのチャンク:

 #If file extension = .txt 
     if ("$temp_dir/$arquivo" =~ /txt$/i){ 

     #Put file line by line inside array 
     open (LEITURA, "$temp_dir/$arquivo"); 
     @manipular = <LEITURA>; 
     close LEITURA; 

     #Open the same file to writing with other filehandler 
     open (ESCRITA, ">", "$temp_dir/$arquivo"); 
     foreach $manipula_linha (@manipular){ 
      # Removes & and accents 
      $manipula_linha =~ s/\&/e/g; 
      $manipula_linha = unac_string("UTF-8", $manipula_linha); 
      print ESCRITA $manipula_linha; 
     }; 
     }; 

     # copy temp file to final destination. If cifs = crash 
     # move also does not work... 
     copy "$temp_dir/$arquivo", "$dest_file"; 
     unlink "$temp_dir/$arquivo"; 

CIFSバージョン:

[[email protected] mail_downloader]# modinfo cifs 
filename:  /lib/modules/2.6.18-409.el5.centos.plus/kernel/fs/cifs/cifs.ko 
version:  1.60RH 
description: VFS to access servers complying with the SNIA CIFS Specification e.g. Samba and Windows 
license:  GPL 

Perlバージョン:

[[email protected] mail_downloader]# perl --version 

This is perl, v5.8.8 built for i386-linux-thread-multi 

Unaccentバージョン:

[[email protected] mail_downloader]# rpm -qa | grep Unaccent 
perl-Text-Unaccent-1.08-1.2.el5.rf 

質問:なぜperl moveまたはcopyにCIFSマウントポイントでこの現象があり、これを解決するための手掛かりがありますか?

明らかに私はファイルの内容をここに掲示することはできません。なぜなら、EDI関連のもので、財務情報があるからです。私はunaccentがcpまたはmvを使用して行われた後のperl copyは自分自身をファイルを扱う場合は、コメント

はまた、ファイルがcifsマウントポイントに正確に移動されます。

答えて

0

さて、私はこれを行うことを誇りに思ってないんだけど、それはかなりこのファイル移動を処理するためにPerlを使用していないことにより、CIFSのバグを解消する回避策です。

moveおよびcopyをperlから使用する代わりに、からsystemまでのオペレーティングシステムを使用してください。コードの

旧チャンク:コアの

copy "$temp_dir/$arquivo", "$dest_file"; 
unlink "$temp_dir/$arquivo"; 

新しいチャンク:

system("/bin/mv", "$temp_dir/$arquivo", "$dest_file"); 
1

問題は本当に明白です - あなたはそれへの書き込みを終了したら、ファイルを閉じていません。他のファイルシステムにコピー/移動すると、ディスクに同期されていないチャンクが失われます。

 open (ESCRITA, ">", "$temp_dir/$arquivo"); 
    foreach $manipula_linha (@manipular){ 
     # Removes & and accents 
     $manipula_linha =~ s/\&/e/g; 
     $manipula_linha = unac_string("UTF-8", $manipula_linha); 
     print ESCRITA $manipula_linha; 
    }; 

    # Flush the file 
    my $old_fh = select(ESCRITA); 
    $| = 1; 
    select($old_fh); 

    close ESCRITA; 
    }; 

    move "$temp_dir/$arquivo", "$dest_file"; 
+0

です。私には恥ずべき。私はテスト目的のために他のスクリプトに書かれたこの無力な機能を持っていました、そして、私は 'close ESCRITA'をこれに移植するのを忘れました。あなたは正しいと思います。 – nwildner

+0

4つの '.txt'ファイルで電子メールを受信した後、問題が再現します。私は、ファイルのクローズに関してのみ関連しているとは思わない。 cifsが利用できないことに関する 'dmesg'メッセージはありません... – nwildner

+0

問題はcifではなく、書き込みをバッファするローカルファイルシステムです。私はファイルを閉じると、ディスクに内容をフラッシュする原因になるだろうが、それは少しの助けが必要なように聞こえる。私は動作するはずのファイルをフラッシュする方法で私の答えを更新しました。 –

関連する問題