Войти

Показать полную графическую версию : [решено] Закрыть дескрипторы только на определенный каталог, но не файлы внутри


MAGNIFICO
02-02-2021, 22:02
Доброго времени суток. Впервые обращаюсь, прошу помощи
Есть очень старая программа где происходит утечка дескрипторов, в handle отображает тысячу раз открытый каталог, и в течении 2х недель прога вылетает. Хочу автоматизировать процесс закрытия хендлов, конкретно на каталог.
в командной строке, свою программу, для примера, я обозвал explorer, и в папке MainDir есть рабочие файлы и каталоги. Задача закрыть хендлы только на директорию MainDir, но не дальше. Т.е. исключить файлы и поддиректории.
for /F "tokens=3,6 delims=: " %I IN ('handle.exe -p explorer -accepteula "C:\Documents and Settings\Admin\Desktop\MainDir"') DO handle.exe -c %J -y -p %IКод выше закрывает все дескрипторы которые принадлежат explorer, и где в поиске встречается "C:\Documents and Settings\Admin\Desktop\MainDir".
Как сделать, чтобы всё, что после MainDir не попадало в список FOR IN в handle ?
Заранее спасибо!

Iska
02-02-2021, 23:35
MAGNIFICO, Вы полагаете, если закрывать хэндлы «ручками» — она не «вылетит»?

MAGNIFICO
03-02-2021, 00:16
Iska, нет, прога работает с файлами. Некоторые залочены, их то и нельзя закрывать. А только корневой каталог, я нашёл причину по которой хендлы растут, это импорт файлов. Точнее пока файл копируется, прога ожидает завершения копирования файла, и в это время дескрипторы увеличиваются, и после не закрываются, когда делаю handle -p mainProgram то у меня в основном только отображается этот каталог. Если решения не найду, буду думать через промежуточный текстовый файл: вывод в список, потом удаление строк, а после закрытие хендлов, но как это сделать пока не знаю. Курю маны)))

DJ Mogarych
03-02-2021, 09:46
Handles отображаются и в powershell с помощью команды

get-process explorer |select *

Я не совсем понимаю задачу и не работал с хэндлами, но, возможно, задачу проще решить пауэршеллом без привлечения доп. программ.

MAGNIFICO
03-02-2021, 13:53
Всем спасибо. Вопрос решен.
handle.exe -p explorer -accepteula "C:\Documents and Settings\Admin\Desktop\MainDir" > handle.txt
sed.exe "/MainDir\\/d" handle.txt > hresult.txt
for /F "tokens=3,6 delims=: " %%I IN (hresult.txt) DO handle.exe -c %%J -y -p %%I

greg zakharov
03-02-2021, 15:27
get-process explorer | select *Дескрипторы (handles) и общая сводка по процессу суть полярные вещи. Дескрипторы никак иначе окромя сторонних модулей не получить, раз, в зависимости от версии pwsh, хост может падать, два (так как для "расшифровки" данных запрашивающий процесс должен выполнять дублирование дескриптора).
Всем спасибо. Вопрос решен.Имея на руках sed всё можно уместить в одну команду. Во-вторых, у handle есть дурная склонность "зомбифицировать" некоторые потоки.

MAGNIFICO
03-02-2021, 16:29
greg zakharov, под линуксом да, там удобнее). А тут XP - я не сильно заморачиваюсь. В общем одни костыли на работе)) само копирует, само конвертирует, сортирует, перекладывает))

alpap
03-02-2021, 17:38
MAGNIFICO,
если все правильно. уберите вывод в файл и команду echo в выводе for

@echo off
for /f "tokens=1,4* delims=: " %%a in ('handle -p "explorer.exe"^|sed -n "/C:\\Documents and Settings\\Admin\\Desktop\\MainDir\\[^\]/p"') do echo handle.exe -c %%a -y -p %%b:%%c >> handle.txt
pause

greg zakharov
03-02-2021, 17:42
alpap, там и цикл не нужен: вывод sed просто передать далее по конвейеру cmd /c + "команда".

alpap
03-02-2021, 18:19
вывод sed просто передать »
может быть, не пробовал, но скорее всего надо фильтровать под утилиту под ключи: -c и -p, колонок там немало и пути с пробелами не отделены.

greg zakharov
03-02-2021, 18:24
Фильтровать ничего не нужно, достаточно изменить представление выводимого потока. Это ж sed.




© OSzone.net 2001-2012