Показать полную графическую версию : Перезапуск программы при пропадании интернета.
Задача такая: Есть коннект менеджер для 4G интернета, но у него нет функции авто-переподключения при обрыве связи.
Есть такой скрипт:
cmdow @ /HID
@echo off
cls
echo %date% - %time%: Connection checking... >>auto.log
set /a WaitTime=120*1
set Address=ya.ru
set /a conn_avail=-1
call :ping
exit
:ping
ping %Address% > Nul
if ERRORLEVEL 0 (
if %conn_avail%==0 (
set /a conn_avail=1
echo %date% - %time%: Connection restored... >>auto.log
)
)
if ERRORLEVEL 1 (
if %conn_avail%==-1 (
echo %date% - %time%: Disconnected! Reconnecting... >>auto.log
)
if %conn_avail%==0 (
echo %date% - %time%: Unable to reconnect... >>auto.log
)
if %conn_avail%==1 (
echo %date% - %time%: Disconnected! Reconnecting... >>auto.log
)
set /a conn_avail=0
call :reboot
)
ping -n %WaitTime% 127.0.0.1 > Nul
call :ping
rem exit /b
:reboot
taskkill /f /im SW_WiMaxCM.exe > Nul
start /D "D:\4G\" SW_WiMaxCM.exe > Nul
exit /b
Работает, но если был дисконект во время таймаута 120с то срабатывает как и положено.
А если дисконект был во время комманды проверки (ping) то программа перезапускается моментально, т.е сначала скрипт пытается запустить еще 1 копию программы не завершая предыдущую. После ошибки программы "programm is running" скрипт останавливается.
Dragokas
18-12-2011, 22:48
Попробуйте:
cmdow @ /HID
@echo off
echo %date% - %time%: Connection checking... >>auto.log
set /a WaitTime=120*1
set Address=ya.ru
set /a conn_avail=1
:ping
ping -n 1 %Address% > Nul
if ERRORLEVEL 0 (
if %conn_avail%==0 (
set /a conn_avail=1
echo %date% - %time%: Connection restored... >>auto.log
)
)
if ERRORLEVEL 1 (
if %conn_avail%==0 (
echo %date% - %time%: Unable to reconnect... >>auto.log
)
if %conn_avail%==1 (
echo %date% - %time%: Disconnected! Reconnecting... >>auto.log
)
set /a conn_avail=0
call :reboot
goto :ping
)
ping -n %WaitTime% 127.0.0.1 > Nul
goto :ping
:reboot
taskkill /f /t /im SW_WiMaxCM.exe > Nul
ping -n 3 127.0.0.1 > Nul
start /D "D:\4G\" SW_WiMaxCM.exe > Nul
exit /b
и лучше поменяйте ya.ru на ближайший веб-узел Вашего провайдера, или посмотрев командой tracert ya.ru
Похоже у вас Freshtel? Попробуйте поставить галочку в инженерном меню. Не факт, но возможно поможет.
http://my.jetscreenshot.com/2642/m_20111218-jsvv-51kb.jpg (http://my.jetscreenshot.com/2642/20111218-jsvv-51kb)
Dragokas
18-12-2011, 23:05
Это у Freshtel-а автоподключение к интернету при запуске менеджера.
А можно мне к темке примазаться? Как раз пытаюсь сделать подобное, только у меня сложнее... У меня перезапуск утилиты не спасает, нужно передергивать модем (такое впечатление, что он зависает). В принципе мой батник работает, но иногда, когда соединение зависает, ping.exe сносит крышу. Вместо ошибок пинга она выдает
C:\Users\admin>ping 8.8.8.8
C:\Users\admin>ping 8.8.8.8
C:\Users\admin>ping 8.8.8.8
C:\Users\admin>ping 8.8.8.8
... и так до бесконечности. Как победить, пока не знаю.
ping -n 1 8.8.8.8
if not errorlevel 1 goto end
ping -n 1 8.8.4.4
if not errorlevel 1 goto end
ping -n 1 freshtel.ua
if not errorlevel 1 goto end
ping -n 1 ukr.net
if not errorlevel 1 goto end
d:\Portable\devcon\devcon.exe disable USB\VID_1076*
ping -n 1 localhost > nul
d:\Portable\devcon\devcon.exe enable USB\VID_1076*
ping -n 4 localhost > nul
d:\Portable\devcon\devcon.exe restart USB\VID_1076*
echo %date% %time% >> d:\Portable\devcon\log.txt
:end
Dragokas
19-12-2011, 00:19
Команда пинг и в правду иногда ведет себя подозрительно, но симитировать все ее ошибки не всегда получается.
Я смотрю Вы подряд пингуете несколько адресов... бывает что freshtel.ua не пингуется, а ukr.net работает?
Могу посоветовать разве что найти какую-то другую методику проверки доступности инета или тот же пинг, но через другой интерфейс.
Например, amel27 писал про WMI http://forum.oszone.net/post-1065308-8.html
Попробуйте подставить туда Ваш код restart-а USB.
Dragokas
19-12-2011, 00:47
Сохраните этот код в файл myping.vbs
iPing = Ping("www.google.com")
If iPing=0 Then
WScript.Echo "0"
Else
WScript.Echo "1"
End If
Function Ping (strTarget)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'")
For Each objPing in colPings
Ping = objPing.StatusCode
Next
End Function
А в этом батнике у Вас будет проверяться наличие инета каждые 120 сек:
@Echo Off
:ping
for /f %%a in ('cscript //nologo myping.vbs') do set inet=%%a
if %inet% == 1 (
d:\Portable\devcon\devcon.exe disable USB\VID_1076*
ping -n 1 localhost > nul
d:\Portable\devcon\devcon.exe enable USB\VID_1076*
ping -n 4 localhost > nul
d:\Portable\devcon\devcon.exe restart USB\VID_1076*
echo %date% %time% >> d:\Portable\devcon\log.txt
ping -n 5 localhost >nul
) else ping -n 120 localhost >nul
goto :ping
Похоже у вас Freshtel? Попробуйте поставить галочку в инженерном меню. Не факт, но возможно поможет. »
Да, FreshTel но российский, и коннект менеджер не такой как на скриншоте. Вообще кривой самописный местными деревенскими программистами :) А какой у вас он? Может и на наш подойдет?
Ближе чем ya.ru ничего не найти, IP провайдера странным образом ходит через германию..
Последние 2 скрипта я так понял перезапускает не менеджер, а драйвер модема?
Пробую все предложенные варианты, позже отпишу результат.
Вот как все печально, 1 хоп закрыт, 2 уже 178мс.
Трассировка маршрута к ya.ru [77.88.21.3]
с максимальным числом прыжков 30:
1 * * * Превышен интервал ожидания для запроса.
2 178 ms 119 ms 80 ms 10.0.0.5
3 65 ms 174 ms 111 ms msk-ix-m9.yandex.net [193.232.244.93]
4 80 ms 144 ms 139 ms 213.180.213.102
5 * * * Превышен интервал ожидания для запроса.
6 54 ms 109 ms 104 ms www.yandex.ru [77.88.21.3]
Трассировка завершена.
Dragokas
19-12-2011, 02:48
У меня, кстати, тоже Wimax от Альтернет (фрештел-а), только на выносной стац.антенне и модем под 220 В и по LAN-у подключается :)
перезапускает не менеджер, а драйвер модема? »
Да, там консольным диспетчером устройств отключается, подключается, а потом еще и обновляется USB-порт, на котором висит модем.
Вам тоже подойдут эти 2 скрипта, если замените строки с "devcon" на свои "taskkill ..."
P.S. Ну можно еще пробовать пинговать до yandex.net или напрямую на адрес 77.88.21.11 (выдал ping yandex.net), чтобы исключить ошибки DNS-сервера и т.п. задержки при переадресациях.
Что то не то... Сделал так:
При пропадании интернета устройство отключается и больше не включается.
@Echo Off
:ping
for /f %%a in ('cscript //nologo myping.vbs') do set inet=%%a
if %inet% == 1 (
"%SystemRoot%\system32\devcon.exe" disable USB\VID_1076*
ping -n 1 localhost > nul
"%SystemRoot%\system32\devcon.exe" enable USB\VID_1076*
ping -n 4 localhost > nul
"%SystemRoot%\system32\devcon.exe" restart USB\VID_1076*
echo %date% %time% >> С:\clog.txt
ping -n 5 localhost >nul
) else ping -n 120 localhost >nul
goto :ping
В окне пишет это:
USB\VID_1076&PID_7F00\72130202 : Disabled
1 device(s) disabled.
В "процес експлорере" видно что скрипт зациклен на команде device Disabled
Dragokas
19-12-2011, 12:33
Дак, я же писал замените строки с "devcon" на свои "taskkill ..." »
Этот код был для YouHim, так как у него перезапуск утилиты не спасает, нужно передергивать модем »
У Вас же должен быть такой код:
@Echo Off
:ping
for /f %%a in ('cscript //nologo myping.vbs') do set inet=%%a
if %inet% == 1 (
taskkill /f /t /im SW_WiMaxCM.exe > Nul
ping -n 3 127.0.0.1 > Nul
start /D "D:\4G\" SW_WiMaxCM.exe > Nul
ping -n 5 localhost >nul
) else ping -n 120 localhost >nul
goto :ping
Переменная inet получает из vbs-скрипта значение 1, когда нет интернета; или 0 - при успешном подключении.
Также я делаю паузы, чтобы процесс успел выгрузится. И после запуска менеджера, чтобы он успел подключится перед следующей проверкой пинга.
Если не успевает подключится в течении 4-5 сек., то значение "5" нужно увеличить здесь "ping -n 5 localhost >nul"
Diskretor, Спасибо. Буду пробовать.
Да, FreshTel но российский, и коннект менеджер не такой как на скриншоте. Вообще кривой самописный местными деревенскими программистами А какой у вас он? Может и на наш подойдет? »
Сам коннект менеджер вот такой.
http://my.jetscreenshot.com/2642/m_20111219-ybcp-9kb.jpg (http://my.jetscreenshot.com/2642/20111219-ybcp-9kb)
А на скриншоте выше его инженерное меню.
Так мне вариант с перезапуском устройства тоже подошел бы. Коннект менеджер так хитро написан что автоматически подключается только при первом запуске или при отключении модема от порта или в устройствах. Вот я и пытался прикрутить "чужой" скрипт под себя, но что то никак.. останавливает но не запускает устройство.
А на скриншоте выше его инженерное меню. »
Хм.. у меня такой же. И как попасть в меню? :)
Dragokas
19-12-2011, 12:50
останавливает но не запускает устройство. »
Возможно тоже проблема с паузами ?
Здесь слишком мало выставлено:
"%SystemRoot%\system32\devcon.exe" disable USB\VID_1076*
ping -n 1 localhost > nul
"%SystemRoot%\system32\devcon.exe" enable USB\VID_1076*
Попробуйте увеличить, хотябы с "1" до "4".
Хм.. у меня такой же. И как попасть в меню? »
Shift+Ctrl+F10 (именно в таком порядке)
login "admin2"
password "admin2"
Diskretor,
Спасибо! vbs cкрипт работает, даже в том случае, когда ping.exe зависал. Но были замечены ложные срабатывания. Возможно из-за потерь пакетов. Что нужно дописать, чтобы скрипт возвращал ошибку после того как пропингует, например, 3 сайта по 10 пингов? Если ни один пинг не прошел, только тогда выполнить переподключение. И желательно пингивать 1 байтом..
Такая многоуровневая перестраховка нужна, так как когда канал загружен под завязку, то пинги почти не прорываются :)
Да, если играть с параметром ping то вроде работает, думаю лучшего варианта не придумать..
В инженерном меню тоже стоит галка на "авто реконнект" но эффекта не дает почему то..
Инсульт, а у вас просто обрывы связи или сам модем подвисает? Когда связь пропала, можно подключиться через коннект менеджер, или нужно обязательно перетыкать модем?
Dragokas
19-12-2011, 16:13
Можно попробовать этим же скриптом с прописанными разными адресами в каждом из vbs файлов. Если при последовательном запуске переменная inet всегда будет == 1, то перезапустить менеджер.
Еще проблема образовалась... Когда канал загружен на 100% закачкой, то пинги не проходят. Совсем. Даже однобайтные.
В этом случае скрипт будет постоянно переподключать модем без толку. Может есть другой способ проверить наличие сети, кроме пинга?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.