Войти

Показать полную графическую версию : Перезапуск программы при пропадании интернета.


Страниц : [1] 2 3

Инсульт
18-12-2011, 13:34
Задача такая: Есть коннект менеджер для 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

YouHim
18-12-2011, 22:54
Похоже у вас 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-а автоподключение к интернету при запуске менеджера.

YouHim
18-12-2011, 23:31
А можно мне к темке примазаться? Как раз пытаюсь сделать подобное, только у меня сложнее... У меня перезапуск утилиты не спасает, нужно передергивать модем (такое впечатление, что он зависает). В принципе мой батник работает, но иногда, когда соединение зависает, 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

Инсульт
19-12-2011, 01:54
Похоже у вас 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-сервера и т.п. задержки при переадресациях.

Инсульт
19-12-2011, 03:18
Что то не то... Сделал так:
При пропадании интернета устройство отключается и больше не включается.

@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"

YouHim
19-12-2011, 12:42
Diskretor, Спасибо. Буду пробовать.
Да, FreshTel но российский, и коннект менеджер не такой как на скриншоте. Вообще кривой самописный местными деревенскими программистами А какой у вас он? Может и на наш подойдет? »
Сам коннект менеджер вот такой.
http://my.jetscreenshot.com/2642/m_20111219-ybcp-9kb.jpg (http://my.jetscreenshot.com/2642/20111219-ybcp-9kb)
А на скриншоте выше его инженерное меню.

Инсульт
19-12-2011, 12:44
Так мне вариант с перезапуском устройства тоже подошел бы. Коннект менеджер так хитро написан что автоматически подключается только при первом запуске или при отключении модема от порта или в устройствах. Вот я и пытался прикрутить "чужой" скрипт под себя, но что то никак.. останавливает но не запускает устройство.


А на скриншоте выше его инженерное меню. »
Хм.. у меня такой же. И как попасть в меню? :)

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".

YouHim
19-12-2011, 14:01
Хм.. у меня такой же. И как попасть в меню? »
Shift+Ctrl+F10 (именно в таком порядке)
login "admin2"
password "admin2"

YouHim
19-12-2011, 15:35
Diskretor,
Спасибо! vbs cкрипт работает, даже в том случае, когда ping.exe зависал. Но были замечены ложные срабатывания. Возможно из-за потерь пакетов. Что нужно дописать, чтобы скрипт возвращал ошибку после того как пропингует, например, 3 сайта по 10 пингов? Если ни один пинг не прошел, только тогда выполнить переподключение. И желательно пингивать 1 байтом..
Такая многоуровневая перестраховка нужна, так как когда канал загружен под завязку, то пинги почти не прорываются :)

Инсульт
19-12-2011, 15:37
Да, если играть с параметром ping то вроде работает, думаю лучшего варианта не придумать..
В инженерном меню тоже стоит галка на "авто реконнект" но эффекта не дает почему то..

YouHim
19-12-2011, 15:48
Инсульт, а у вас просто обрывы связи или сам модем подвисает? Когда связь пропала, можно подключиться через коннект менеджер, или нужно обязательно перетыкать модем?

Dragokas
19-12-2011, 16:13
Можно попробовать этим же скриптом с прописанными разными адресами в каждом из vbs файлов. Если при последовательном запуске переменная inet всегда будет == 1, то перезапустить менеджер.

YouHim
19-12-2011, 17:49
Еще проблема образовалась... Когда канал загружен на 100% закачкой, то пинги не проходят. Совсем. Даже однобайтные.
В этом случае скрипт будет постоянно переподключать модем без толку. Может есть другой способ проверить наличие сети, кроме пинга?




© OSzone.net 2001-2012