Что ж, это самая странная проблема, связанная с файловой системой, с которой я столкнулся за долгое время.
У меня есть скрипт, который в основном подключается к удаленному серверу imap, загружает электронные письма, помечает их как прочитанные, срывает мусор для загрузки только файлов .txt
и .xml
. Если .txt
, используйте Text::Unaccent
для удаления диакритических знаков.
Это делается при отношении 1-к-1 удаленной папки imap к локальной смонтированной папке cifs на этом сервере. Удалить загрузку imap и обработку акцентуации работает просто отлично.
Моя проблема: ЕСЛИ я загружаю файл, обрабатываю выделение и перемещаю его в смонтированный каталог cifs
, файл срывается (отсутствуют последние 4–10 КБ). Если я перемещу его в другой раздел на том же компьютере, файлы будут перемещены в разумном порядке (тот же 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";
Cif-версия:
[root@server 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
Перл версия:
[root@server mail_downloader]# perl --version
This is perl, v5.8.8 built for i386-linux-thread-multi
Версия без акцента:
[root@server mail_downloader]# rpm -qa | grep Unaccent
perl-Text-Unaccent-1.08-1.2.el5.rf
Вопрос. Есть какие-нибудь подсказки, почему perl move
или copy
ведут себя так с точкой монтирования cifs и как это решить?
Очевидно, я не могу публиковать содержимое файлов здесь, потому что они связаны с EDI и содержат некоторую финансовую информацию.
Кроме того, если я прокомментирую perl copy
, сам обработаю файл после того, как снят акцент с использованием cp
или mv
, файл будет правильно перемещен в точку монтирования cifs
.