01.10.2010 07:47
В общем, напоролся на неприятность.
Есть общая процедура запуска программ. Она запускает программу и отсчитывает некоторое время, пока не увидит какой-нибудь вывод этой программы или не дождется ее завершения. Это необходимо, чтобы оценить подвисание запущенной проги. Алгоритм заткнулся на 7z, который во время многочасового архивирования базы не выводит ровным счетом ничего.
Есть идеи, как заставить 7z что-то выводить? (многотомник бы очень не хотелось делать). Под Линуксом достаточно все просто, верю, что 7z не виснет и запускаю его так:
Код:
7z a -pпароль -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on -mhe=on архив файл 2>&1 & while pgrep 7z>/dev/null; do echo \"7z running `date`"; sleep 240; done
т.е. просто проверяю наличие 7z в процессах и вывожу строку сам.
Можно под виндой собрать такую же строку (крайне желательно без сторонних программ)? Еще какие-то идеи?
01.10.2010 16:08
Штатный qprocess.exe или PsList.exe из Sysinternals (считаем, что штатная ). Вывод - в pipe, а там подхватывать и анализировать, скажем findstr.exe
01.10.2010 17:23
Цитата:
OlegON Алгоритм заткнулся на 7z, который во время многочасового архивирования базы не выводит ровным счетом ничего.
запускаешь строку как?
можно шелом с созданием окна и проверять наличие окна по хендлу - пока есть - ждем

либо - код на vb но смысл понятен

hInstance = Shell(strCommand, intMode)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or SYNCHRONIZE, True, hInstance)
Do
rcf = GetExitCodeProcess(hProcess, lngExitCode)
Loop Until lngExitCode <> STILL_ACTIVE

я так раньше рар ловил...

сейчас сам зипую без внешних архиваторов
01.10.2010 19:25
Немножко не о том... Как отловить это чисто по процессу - понятно, но мне необходимо, чтобы этот процесс что-то писал в stdin, который передается серверу, а сервер всем и рулит. Твой вариант не подходит, потому, что речь идет о java. И пускается оно на куче платформ :( Поэтому переписывать клиента под конкретно отслеживание запуска с винды... Не хочется совсем :( И преимущества 7z перед зипом очевидны...
01.10.2010 19:26
Цитата:
grannie Штатный qprocess.exe или PsList.exe из Sysinternals (считаем, что штатная ). Вывод - в pipe, а там подхватывать и анализировать, скажем findstr.exe
Все таки они не штатные, а речь идет о том, что должна работать программа, написанная мной, но устанавливаемая другими.
02.10.2010 01:20
java и проч. не знаю, дилетантски предположу, что нужно заворачивать 7z во что-то, самостоятельно генерирующее вывод в stdout. Если в скрипт, то он все равно будет платформозависимый.


А на тему "под виндой собрать такую же строку".

Код сомнительной надежности, проверено только в 2003:

Код:
start 7z a -p123 -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on -mhe=on архив файл >7z_run.lck & @echo off & for /L %I in (0,0,0) do (( del 7z_run.lck & if not exist 7z_run.lck exit /b ) 2>nul >nul & set /a x=x+1 & echo : 7z running & (timeout /t 5) >nul)
Смотрится файл-флаг, который жив, пока работает 7z
Есть проблемка с %date% %time% - в одной строке не получается вывести их изменения.

Главный тормоз по "стандартными командами отследить процесс по имени" - W2000, т.к. в XP и выше есть tasklist
Еще может не быть timeout, тогда вместо него ping...
02.10.2010 04:43
Извини, попробовать пока особо не на чем, но тут вообще весь вывод 7z сваливается в файл, который не удается удалить, пока работает 7z, так? Интересная идея, только вот вывод все же нужно в stdout оставить, чтобы можно было лог посмотреть в итоге... Но это детали, если вместо del mv использовать, оно даст переименовать? Я потом пробегусь по логам, есть некоторое убеждение, что нет нигде 2000.
За идею спасибо.
02.10.2010 11:01
Цитата:
OlegON Твой вариант не подходит, потому, что речь идет о java.
а может стоит тогда посмотреть в сторону

прикрутить все один раз внутри явы и не юзать сам 7зип который использует те же алгоритмы что в сдк?
тогда уж точно будет все кроссплатформенно и будет фулл контроль
02.10.2010 14:23
Возни много ради пшика :) Опять же библиотеку под разные платформы гонять...
02.10.2010 20:11
Цитата:
OlegON Извини, попробовать пока особо не на чем, но тут вообще весь вывод 7z сваливается в файл, который не удается удалить, пока работает 7z, так? Интересная идея, только вот вывод все же нужно в stdout оставить, чтобы можно было лог посмотреть в итоге...
Там весь вывод от 7z пропадал совсем.
Подправленный вариант:

Код:
start /b 7z a -p123 -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on -mhe=on архив файл 9>7z_run.lck & @echo off & for /L %I in (1,1,1000000000000) do (( del 7z_run.lck & if not exist 7z_run.lck exit ) 2>nul >nul & echo %I : 7z running & (timeout /t 5) >nul)
Тут на экране смешивается вывод 7z и echo.
Но если засунуть это в cmd и вывод куда либо перенаправить - проценты прогресса от 7z пропадают совсем, а остальное дописывается в самом конце.
Часовой пояс GMT +3, время: 21:32.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.