psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2012-06-26 10:53 am

Что за хрень творится?!

Сколько пишу .bat-файлы, но с такой хренью не сталкивался. У меня .bat-сценарий случайным образом (т.е. не каждый раз) выдает ошибку access denied при попытке исполнить только что созданную программу или при попытке удалить только что исполненную программу. Выглядит так, как будто программа еще не успела дописаться к моменту запуска и не успела отработать к моменту удаления.

Сам скрипт:


@echo off
:a
copy /B 7z.exe 7.exe >nul
7.exe >nul
del 7.exe >nul
goto a


В консоль выдает ошибки:


E:\->e.bat
Access is denied.
The requested operation cannot be performed on a file with a user-mapped section open.
Access is denied.
Access is denied.
Access is denied.
Access is denied.
Access is denied.
Access is denied.
Access is denied.
Access is denied.
Access is denied.
The requested operation cannot be performed on a file with a user-mapped section open.
Access is denied.
The requested operation cannot be performed on a file with a user-mapped section open.
Access is denied.
Access is denied.
Access is denied.


Сопутствующие обстоятельства:
1. ОС Windows 7 Enterprise, процессор Intel Core 2 Quad
(под XP не воспроизводится)
2. Антивирус - AVAST
(однако отключение всех его "экранов" в момент запуска скрипта не помогло)
3. Скрипт исполнялся в "консоли" Far и в стандартной консоли (cmd, start)
(глюк случается во всех консолях)
4. Диск E:, на котором все происходит, ничем не примечателен - обычный жесткий, никаких экзотических режимов на нем не включено
5. То, что в примере использован 7z.exe, неважно: тот же глюк воспроизводится, если взять какую-нибудь другую консольную программу, которая при запуске без параметров немного пишет в stdout и без задержки завершается.


Помогите разобраться, пожалуйста :)

Upd: спасибо [livejournal.com profile] metaclass, проблема решена.

[identity profile] sam-buddy.livejournal.com 2012-06-26 07:02 am (UTC)(link)
А если @echo off убрать, тогда что?

[identity profile] psilogic.livejournal.com 2012-06-26 07:10 am (UTC)(link)
Тогда просто менее наглядно (больше текста в консоли), и видно, что эти ошибки происходят после команд 7.exe и del, но не каждый раз, а случайно.

[identity profile] sam-buddy.livejournal.com 2012-06-26 07:12 am (UTC)(link)
У 7.exe атибут рид-онли часом не стоит? Атрибуты, кажись, тоже копируются.

[identity profile] psilogic.livejournal.com 2012-06-26 07:15 am (UTC)(link)
Нет, не стоит. И вообще ошибки выскакивают не каждую итерацию, а иногда раз в 100 циклов. Т.е. по всем признакам что-то такое нехорошее с синхронизацией процессов.

[identity profile] http://users.livejournal.com/_stilgar/ 2012-06-26 07:05 am (UTC)(link)
Для начала - запустить под администратором. Если не сработает - значит, 99% - антивирус. Или вирус, они сейчас примерно равнозначны по вредоносности.

[identity profile] psilogic.livejournal.com 2012-06-26 07:14 am (UTC)(link)
Под админисратором глюка нет. Но при чем тут админисратор, если все права для исполнения скрипта имеются? Иногда проходит 200 успешных итераций цикла до появления первого Access denied.
Edited 2012-06-26 07:16 (UTC)

[identity profile] http://users.livejournal.com/_stilgar/ 2012-06-26 07:22 am (UTC)(link)
попробуй после копирования поставить
timeout /T 1 >nul

если пауза в 1 не критична.

[identity profile] psilogic.livejournal.com 2012-06-26 07:25 am (UTC)(link)
тогда вроде нет ошибок

[identity profile] http://users.livejournal.com/_stilgar/ 2012-06-26 07:28 am (UTC)(link)
Судя по всему, права файла не всегда успевают обновиться сразу после копирования.

[identity profile] metaclass.livejournal.com 2012-06-26 07:32 am (UTC)(link)
Восстановление системы, индексация диска и прочий трэш случаем не мешают?

[identity profile] metaclass.livejournal.com 2012-06-26 07:33 am (UTC)(link)
Запусти procmon.exe (от sysinternals)
Добавь в фильтр "имя файла" 7.exe
И запиши лог операций с ними - далее его можно будет проанализировать на предмет пересекающихся операций с этим файлом.
Edited 2012-06-26 07:33 (UTC)

[identity profile] eugenebo.livejournal.com 2012-06-26 08:29 am (UTC)(link)
+1.

И почти наверняка антивирус. Видит новый экзешник, хочет проверить, открывает с эксклюзивным правом на чтение, а тут вдруг мы со своим удалением, "как некстати!..."

[identity profile] psilogic.livejournal.com 2012-06-26 08:17 pm (UTC)(link)
Спасибо, это была хорошая идея: по результатам расследования виновным признан Comodo Firewall

[identity profile] crackadil.livejournal.com 2012-06-26 08:37 am (UTC)(link)
попробуй саму службу аваста остановить :)

[identity profile] litvin-v.livejournal.com 2012-06-26 09:55 am (UTC)(link)
Не поможет?
start /wait 7.exe

[identity profile] 2000000lemmings.livejournal.com 2012-06-26 10:08 am (UTC)(link)
+100500
Без этого интерпретатор не будет ждать завершения программы перед выполнением следующей команды.
no1u1w1w6c: (Default)

[personal profile] no1u1w1w6c 2012-06-26 05:00 pm (UTC)(link)
вообще-то как раз без start всю жизнь ждал. они и это умудрились ненавязчиво поменять в своей новой говноос?

[identity profile] psilogic.livejournal.com 2012-06-26 07:47 pm (UTC)(link)
это в start не будет ждать, а так, как в скрипте - должен ждать

[identity profile] psilogic.livejournal.com 2012-06-26 07:46 pm (UTC)(link)
пробовал, не помогает

[identity profile] karadriel.livejournal.com 2012-07-10 05:54 pm (UTC)(link)
Единственное что вызывает недоумение - зачем такой странный скрипт? О.о

[identity profile] psilogic.livejournal.com 2012-07-10 06:51 pm (UTC)(link)
Для простоты восприятия. Изначально проблема возникла на скрипте автотестирования с той же проблемой, но в 200 строк длиной.

[identity profile] karadriel.livejournal.com 2012-07-11 08:18 am (UTC)(link)
Ага... ага... выделили проблемный участок. Любопытная проблема, буду знать.
Edited 2012-07-11 08:18 (UTC)