7-почтовый файл используется
Мы используем несколько серверов Apache Tomcat. Хорошая часть пролонгации журналов, как они должны в зависимости от часа или в конце дня. Тем не менее, есть все еще число, которое остается заблокированным Apache Tomcat или веб-сервисами.
Фактически зарегистрировали это как ошибку на - http://sourceforge.net/p/sevenzip/bugs/1488/
Вы видели удивительный пост dbenham (ПРИМЕЧАНИЕ: он находится под вторым заголовком "EDIT", о чем я говорю) о том, как обращаться с используемым файлом. Тем не менее, я все еще сталкиваюсь с конкуренцией с использованием файлов. Я знаю WinZip Command-line, возможно, вариант, но я действительно не хочу использовать это.
У нас есть ночной процесс, который имеет гораздо больше функций, чем этот, но для иллюстрации мы будем использовать следующее:
FOR /r "C:\tomcat\logs" %%X IN (*) DO (
7za a -y D:\17\%%~nxX.zip %%X
)
PAUSE
Итак, в результате мы видим пустые zip-файлы с числом или 22 байта. Да, мы знаем, что нельзя заархивировать "используемый" файл, но если он входит в список каталогов, мы видим эту проблему.
Есть ли что-то, что мы можем сделать?
Volume in drive D is New Volume
Volume Serial Number is A476-BD38
Directory of D:\17
03/07/2015 02:05 PM <DIR> .
03/07/2015 02:05 PM <DIR> ..
03/07/2015 02:05 PM 403 catalina.2015-03-06.log.zip
03/07/2015 02:05 PM 22 catalina.2015-03-07.log.zip
03/07/2015 02:05 PM 22 host-manager.2015-02-23.log.zip
03/07/2015 02:05 PM 22 localhost.2015-02-23.log.zip
03/07/2015 02:05 PM 22 manager.2015-02-24.log.zip
03/07/2015 02:05 PM 22 probe.log.zip
6 File(s) 513 bytes
2 Dir(s) 51,783,634,944 bytes free
Обычно мне было бы наплевать на 22-байтовые файлы, но мы должны наблюдать за ними, так как они отправляются ночью поставщику для обработки отчетов.
Глядя на скрипт в том, как мы его используем, мы имеем:
REM SET VARIABLES
FOR /f "tokens=2-4 delims=.:/ " %%a IN ("%date%") DO SET CurrentDate=%%c-%%a-%%b
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:\17" %%X IN (*) DO (
SET FileName=%%~nxX
FOR /f "tokens=2-4 delims=.:/ " %%a IN ("%%~tX") DO SET FDate=%%c-%%a-%%b
REM CHECK FOR UNLOCKED FILE
REM https://stackru.com/a/10520609/1333331
2>nul ( >>"D:\17\!FileName!" (call )) && (
REM DO STUFF HERE
IF "%CurrentDate%" NEQ "!FDate!" (
IF %%~zX GTR 0 (
ECHO ARCHIVING "D:\logs\!FileName!" >>%logfile%
7za.exe -tzip -y a "D:\Archive\some.zip" "D:\17\!FileName!" && DEL "D:\17\!FileName!"
)
)
REM END OF UNLOCKED ZONE
) || (
ECHO FILE IS LOCKED
)
)
ENDLOCAL
Спасибо!
2 ответа
Мне пришлось столкнуться с чем-то похожим для недавнего проекта, и я решил сначала клонировать исходный каталог с помощью robocopy, чтобы избежать проблемы с используемым файлом. Robocopy предлагает режимы /z, /b и /zb для копирования файлов в режимах перезапуска, резервного копирования и резервного копирования + перезапуска соответственно. Использование /zb позволяет копировать используемые файлы в выбранный вами каталог назначения. Я также добавляю "/r:1 /w:1" к вызовам robocopy, чтобы повысить производительность, когда он задыхается в файле или не хватает места (/r:1 = повторная попытка только один раз, /w:1 = ожидание только одну секунду между повторы). Береженого Бог бережет.
Это займет больше места, так как дублирует журналы, но избавит вас от проблем с используемыми файлами. Если вы измените свой исходный код на следующий, вы получите желаемые результаты (и удалите копии файлов по мере их сжатия):
robocopy "c:\tomcat\logs" "c:\temp\tomcat\logs" /zb /s /e /mir /r:1 /w:1
FOR /r "C:\temp\tomcat\logs" %%X IN (*) DO (
7za a -sdel -y D:\17\%%~nxX.zip %%X
)
robocopy "C:\temp\tomcat\logs" "C:\temp\tomcat\logs" /s /move
Первая строка дублирует папку логов в temp. Изменение 7za (-sdel) удаляет журналы во временной папке, когда они сжаты. Последняя строка удаляет все пустые подкаталоги из папки временных журналов.
Если вы не возражаете против использования дополнительного пространства вместо использования дополнительного ЦП + ОЗУ + время каждого прохода, вы можете оставить постоянный кеш во временной папке и перезаписать только новые файлы, используя:
robocopy "c:\tomcat\logs" "c:\temp\tomcat\logs" /zb /s /e /mir /r:1 /w:1
FOR /r "C:\temp\tomcat\logs" %%X IN (*) DO (
7za a -y D:\17\%%~nxX.zip %%X
)
Я знаю, что эта ветка устарела, но недавно у меня была такая же проблема, и я решил ее с помощью переключателя "-sse" в 7z.exe. Это остановит создание пустого архива, если файл уже используется.
Мне удалось выяснить довольно большую часть этой проблемы.
Проблема, с которой мы столкнулись, заключается в использовании Touch.exe от Cygwin и Unxutils.
Если вы читаете о том, как создать файл с нулевым байтом, вы увидите следующую статью, когда будете выполнять поиск этого:
http://www.computerhope.com/issues/ch001314.htm
И в результате это заставило меня задуматься о том, что это именно моя проблема. Если файл не существует или используется Tomcat или другими веб-службами, touch в любом случае создаст файл с нулевым байтом (Примечание. Я действительно думал, что я перемещаю файлы из предыдущих дней обработки в рабочие папки и архив оттуда). В результате с нулевым байтом мы получили 22-байтовые файлы air-zip. Doh!!!
Причина, по которой мы используем сенсорный ввод, заключается в том, что мы хотели повторно установить временную метку файла с датой, когда файл был сгенерирован, не обязательно с датой, когда файлы были заархивированы, поскольку у нас есть около 600 ГБ данных веб-журнала, которые мы заархивировали. Мы смогли обойти это с помощью небольшого сценария PowerShell, и таким образом мы исключили любой риск создания неправильных файлов. Да, это может быть достигнуто с помощью VBScript, но PowerShell нам не нужно кодировать наши скрипты.
REM RE-DATE THE FILES
PowerShell -file D:\work\scripts\redate.ps1
и содержимое обновленного скрипта PowerShell: (Ваш учет может отличаться, так как у нас есть переменные даты как часть имени файла):
$1dir='D:\logs\Archives\SubLog'
$2dir='D:\logs\Archives\Tomcat'
$3dir='D:\logs\Archives'
if (Test-Path "$1dir\*.zip")
{
$files = Get-ChildItem $1dir *.zip
foreach ($file in $files)
{
$filename = $file.name
$fullname = $file.FullName
$DT = $file.name.substring(0, 8)
$mm = $file.name.substring(4, 2)
$dd = $file.name.substring(6, 2)
$yy = $file.name.substring(0, 4)
$DTNew = [datetime]"$mm/$dd/$yy"
(dir $fullname).lastwritetime = $DTNew
}
}
if (Test-Path "$2dir\*.zip")
{
$files = Get-ChildItem $2dir *.zip
foreach ($file in $files)
{
$filename = $file.name
$fullname = $file.FullName
$mm = $filename.Split("-")[2]
$dd = $filename.Split("-")[3]
$yy = $filename.Split("-")[4]
$DateVar = [datetime]"$mm/$dd/$yy"
(dir $fullname).lastwritetime = $DateVar
}
}
if (Test-Path "$3dir\*.zip")
{
$files = Get-ChildItem $3dir *.zip
foreach ($file in $files)
{
$filename = $file.name
$fullname = $file.FullName
$yy = $filename.Split("-")[1]
$mm = $filename.Split("-")[2]
$dd = $filename.Split("-")[3]
$DateVar = [datetime]"$mm/$dd/$yy"
(dir $fullname).lastwritetime = $DateVar
}
}