Показать полную графическую версию : Перезапуск программы при пропадании интернета.
Dragokas
19-12-2011, 18:09
Теоретически "Сетевые виджеты" получают информацию о загруженности канала. Если бы можно было получать такую информацию посредством батника...
Может так-то можно по этим параметрам идентифицировать отсутствие сети?
Сеть есть и сети нет сооответственно:
Настройка протокола IP для Windows
Имя компьютера . . . . . . . . . : admin-home
Основной DNS-суффикс . . . . . . :
Тип узла. . . . . . . . . . . . . : Гибридный
IP-маршрутизация включена . . . . : Нет
WINS-прокси включен . . . . . . . : Нет
Порядок просмотра суффиксов DNS . : freshtel.com.ua
Ethernet adapter Подключение по локальной сети 3:
DNS-суффикс подключения . . . . . : freshtel.com.ua
Описание. . . . . . . . . . . . . : GCT WiMAX USB Network Device
Физический адрес. . . . . . . . . : 00-11-A4-80-0B-98
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe80::5da1:75ff:aef2:f6db%16(Основной)
IPv4-адрес. . . . . . . . . . . . : 10.4.90.5(Основной)
Маска подсети . . . . . . . . . . : 255.255.0.0
Аренда получена. . . . . . . . . . : 19 грудня 2011 р. 18:50:23
Срок аренды истекает. . . . . . . . . . : 20 грудня 2011 р. 18:50:23
Основной шлюз. . . . . . . . . : 0.0.0.0
DHCP-сервер. . . . . . . . . . . : 192.168.84.1
IAID DHCPv6 . . . . . . . . . . . : 285221127
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-16-22-3A-73-00-16-E6-86-7E-63
DNS-серверы. . . . . . . . . . . : 193.19.247.114
193.19.247.115
NetBios через TCP/IP. . . . . . . . : Включен
Настройка протокола IP для Windows
Имя компьютера . . . . . . . . . : admin-home
Основной DNS-суффикс . . . . . . :
Тип узла. . . . . . . . . . . . . : Гибридный
IP-маршрутизация включена . . . . : Нет
WINS-прокси включен . . . . . . . : Нет
Ethernet adapter Подключение по локальной сети 3:
Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . : freshtel.com.ua
Описание. . . . . . . . . . . . . : GCT WiMAX USB Network Device
Физический адрес. . . . . . . . . : 00-11-A4-80-0B-98
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
Инсульт, а у вас просто обрывы связи или сам модем подвисает? Когда связь пропала, можно подключиться через коннект менеджер, или нужно обязательно перетыкать модем? »
Нет, не виснет модем. Просто отключается с ошибкой "неправильный логин\пароль" И сам не подключается пока не нажмешь "подключить". И так довольно часто, бывает 10 раз в час. Если что то качать например фильм надо сидеть контролировать что не очень удобно.
Не проще через WMI определять подключен адаптер к сети или нет?
Вот как бы в скрипте увеличить время пинга ya.ru а то 4 запроса мало. Если и правда интернет временно затупил изза торрента или еще чего что бы не перезагружался зря.
Как то все сложно выходит. Проще скрипт на autoit сделать что бы нажимал кнопку "подключиться" :)
Не проще через WMI определять подключен адаптер к сети или нет? »
Знать бы как это сделать... Я в этом, к сожалению, ничего не смыслю.
Кстати, винда сообщает, что соединение нерабочее, хотя коннект менеджер показывает противоположное. Вот по этому параметру можно было бы и запускать скрипт.
http://my.jetscreenshot.com/2642/m_20111219-ddgf-28kb.jpg (http://my.jetscreenshot.com/2642/20111219-ddgf-28kb)
UPD: вот скрипт, который, выдает статус адаптера. http://forum.oszone.net/post-1810790-86.html
Переделать бы его..
http://my.jetscreenshot.com/2642/m_20111219-urde-86kb.jpg (http://my.jetscreenshot.com/2642/20111219-urde-86kb)
Dragokas
20-12-2011, 00:23
Если Вам приемлимо использовать стороннее freeware ПО, то могу предложить еще способ с linux-утилитой wget, переписанной под Win:
Скачать Wget (http://dfn.dl.sourceforge.net/project/gnuwin32/wget/1.11.4-1/wget-1.11.4-1-setup.exe)
Она лишена недостатков со сбоями, как в Ping и может принимать самые различные ключи.
Написал код, когда Wget делает 4 попытки по около ~5 сек. Если подключение удачно - идет таймаут 120 сек. и повторная проверка доступности узла Yandex.net (лучше указывать IP-адрес):
@Echo Off
:ping
echo testing inet...
"%programfiles(x86)%\GnuWin32\bin\wget.exe" --spider 77.88.21.11 --tries=4 --timeout=20 2>nul
if %errorlevel% == 0 (ping -n 120 localhost>nul&goto :ping)
echo Restarting inet
::Код для рестарта модема (менеджера)
ping -n 10 localhost >nul&goto :ping
Если нужно, могу дописать и чтобы пропингует, например, 3 сайта по 10 пингов? Если ни один пинг не прошел, только тогда выполнить переподключение. »
Переделать бы его.. »
Переделать - no problem, но
YouHim, вот там, где Вы подчеркнули connected - Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected?
Можно ввести дополнительную проверку:
Перезапускать модем только, если одновременно выполняются два условия:
1) Не проходит ни один пинг
2) Network adapter выдает статус Disabled.
как бы в скрипте увеличить время пинга ya.ru а то 4 запроса мало. »
Если это поможет: ping -f -n 10 -w 3000 -l 1 ya.ru (без фрагментации пакетов, ожидание ответа от сервера в 3 сек., размер пакета 1 байт, отправка 10 пакетов).
Проще скрипт на autoit сделать что бы нажимал кнопку "подключиться" »
Совсем не сложно. Берете прогу ScriptWriter повторяете действие (нажать кнопку "подключиться"), сохраняте скрипт, компилируете. Адрес Ехе-шника прописіваете в батник после строк с перезапуском менеджера: Start "" /min c:\button.exe
вот там, где Вы подчеркнули connected - Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected? »
Пока что 100% не уверен, так как нужно ждать реального разрыва. Эмуляция обрыва с помощью файрволла показала, что данное значение меняется. Пришлось засесть на несколько часов за изучение vbs. В результате сваял вот такой скрипт:
strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")
Command ="d:\Portable\Script\restart_modem\devcon.exe disable USB\VID_1076*"
Command1="d:\Portable\Script\restart_modem\devcon.exe enable USB\VID_1076*"
Command2="d:\Portable\Script\restart_modem\devcon.exe restart USB\VID_1076*"
Command3="d:\Portable\Script\restart_modem\SW_WiMaxCM.lnk"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapter WHERE Name = 'GCT WiMAX USB Network Device'",,48)
For Each objItem in colItems
rem Wscript.Echo "NetConnectionStatus: " & objItem.NetConnectionStatus
status = objItem.NetConnectionStatus
if status<>2 Then
WshShell.Run "taskkill /IM SW_WiMaxCM.exe", 0
WshShell.Run Command
WScript.Sleep 2000
WshShell.Run Command1
WScript.Sleep 5000
WshShell.Run Command2
t = now()
Set FSO = CreateObject("Scripting.FileSystemObject")
Set f = FSO.OpenTextFile("log.txt", 8, True)
f.WriteLine t
WshShell.Run Command3
Wscript.Echo "GCT WiMAX USB Network Device restarted"
Else
End if
Next
Запускать буду через планировщик. С эмуляцией обрывов работает отлично, буду надеяться, что реальный обрыв он тоже отработает. За быдлокод прошу не пинать, это первый мой vbs скрипт :)
Diskretor, за wget, спасибо. Попробую и ее поковырять на досуге.
Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected? »
К сожалению, ваши предчувствия оправдались. При реальном обрыве ничего не меняется. Статус сети так и висит "подключено". Получается, что локально зафиксировать проблему никак нельзя. Только пинговать... Но пинги тоже не спасают. Я в тупике.
Dragokas
20-12-2011, 12:22
Есть такая команда "netstat -s" если ее запустить дважды через секундный интервал, то имеем количество полученных за это небольшое время пакетов:
Алгоритм:
1) 5 последовательных Ping --> все fail AND Packets > 1000 - ничего не делаем (канал перегружен прогой Utorrent)
1) 5 последовательных Ping --> все fail AND Packets <= 50 - Restart Modem
Есть только один недостаток, если у Вас несколько LAN-ов, или работает локальная сеть этот метод будет работать неправильно (а фильтра устройств в этой команде я не нашел).
Anonymоus
20-12-2011, 12:23
Но пинги тоже не спасают »
Подозреваю, это связано с тем, что ping не всегда возвращает ненулевой errorlevel, если пинг не прошел. Сталкивался с этим во время написания одного скрипта, ping выдавал "Ответ от мой_внешний_ip: Заданная сеть недоступна.", но errorlevel равнялся нулю.
Предлагаю делать тщательный разбор того, что возвращает нам ping, а не слепо полагаться на %ErrorLevel% У меня это реализовано вот так:
Ping -n 1 -w 1000 8.8.8.8|Find "TTL=">nul&&Echo Connected
или
Ping -n 1 -w 1000 8.8.8.8|Find "TTL=">nul
If %ErrorLevel%==0 (
Echo Online
) Else (
Echo Offline
)
Второй вариант предпочтительнее, когда нужно в зависимости от того, прошел пинг или нет - совершить разные действия, ведь && и || одновременно в однострочник не вставишь. В ответе ping ищется именно "TTL=" по нескольким причинам: 1) Не зависит от локализации системы; 2) Появляется только при действительно прошедшем пинге.
Ещё, как вариант - можно использовать GnuWin32 wget и тянуть google.com/favicon.ico, а затем проверять на наличие файла (ключами указать несколько попыток и достаточный таймаут)
Есть такая команда "netstat -s" если ее запустить дважды через секундный интервал, »
Кажись понял идею. Попробую.
Anonymоus, Извиняюсь, но ничего не понял... Можно как для ламера разжевать? :)
Dragokas
22-12-2011, 01:05
Т.е. он имел в виду, что иногда, даже если сайт не пингуется, команда пинг все равно выдаст успешный результат - и это приведет к перезапуску модема в написанных нами скриптах. Нужно все лишь добавить конец команды пинг это |Find "TTL="
Рассмотрим пример:
1) Ping выдает это:
"Сбой команды ......."
и передает, что завершено все без ошибок ---> скрипт перезагружает модем.
Мы дописываем |Find "TTL=", и теперь уже проверяется успешность выполнения именно этой команды.
Find ищет наличие строки "TTL=" в отчете, выданном предыдущей командой
Знак | как раз его и передает.
--> команда выполнится с ошибкой (строка "TTL="не найдена) ---> скрипт не будет пускать перезагрузку.
>ping 8.8.8.8
Обмен пакетами с 8.8.8.8 по с 32 байтами данных:
Ответ от 8.8.8.8: число байт=32 время=64мс TTL=46
Ответ от 8.8.8.8: число байт=32 время=63мс TTL=46
...
>ping 8.8.8.8 | Find "TTL="&&echo Privet!
...
Privet!
Символ && - следующая за ним команда выполняется, если предыдущая (перед &&) выполнена без ошибок (%errorlevel% = 0)
Символ || - следующая за ним команда выполняется, если предыдущая (перед &&) выполнена с ошибкой (%errorlevel% <> 0)
Опять прошу помощи!
Решил начать все сначала. Пишу скрипт, который пингует 3 хоста. Если все 3 не отвечают - перезагружает софт и модем.
iPing = Ping("195.195.195.195")
iPing1 = Ping1("195.195.195.195")
iPing2 = Ping2("195.195.195.195")
strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")
Command ="d:\Portable\Script\restart_modem\devcon.exe disable USB\VID_1076*"
Command1="d:\Portable\Script\restart_modem\devcon.exe enable USB\VID_1076*"
Command2="d:\Portable\Script\restart_modem\devcon.exe restart USB\VID_1076*"
strProcessKill = "'SW_WiMaxCM.exe'"
strProcessStart="d:\Portable\Script\restart_modem\SW_WiMaxCM.lnk"
Function Ping (strTarget)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'AND Timeout=10000 AND BufferSize=1")
For Each objPing in colPings
Ping = objPing.StatusCode
Next
End Function
If iPing=0 Then
WScript.Quit
end if
Function Ping1 (strTarget)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'AND Timeout=10000 AND BufferSize=1")
For Each objPing in colPings
Ping1 = objPing.StatusCode
Next
End Function
If iPing1=0 Then
WScript.Quit
end if
Function Ping2 (strTarget)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPings = objWMIService.ExecQuery ("Select * From Win32_PingStatus where Address = '" & strTarget & "'AND Timeout=10000 AND BufferSize=1")
For Each objPing in colPings
Ping2 = objPing.StatusCode
Next
End Function
If iPing2=0 Then
WScript.Quit
end if
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& ".\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where Name ='GCTWiMaxService'")
For Each objService In colListOfServices
objService.StopService
WshShell.Run Command
WScript.Sleep 2000
WshShell.Run Command1
WScript.Sleep 5000
WshShell.Run Command2
t = now()
Set FSO = CreateObject("Scripting.FileSystemObject")
Set f = FSO.OpenTextFile("log.txt", 8, True)
f.WriteLine t
objService.StartService
WshShell.Run strProcessStart
Wscript.Echo "GCT WiMAX USB Network Device restarted"
Next
Столкнулся с одной проблемой. Если модем отсутствует, то скрипт выдает вот такую ошибку
C:\Users\admin\AppData\Roaming\WMICodeCreator\MyWMIQuery_Script.vbs(20, 3) (null): 0x80041001
вот в этом месте:
For Each objPing in colPings
Ping = objPing.StatusCode
Мне же нужно, чтобы при отсутствии модема тоже срабатывала перезагрузка. Помогите решить задачу.
Вот так вроде работает как надо:
cmdow @ /HID
@Echo Off
Set /A WaitTime=120*1
Set Address=ya.ru -n 15
:Loop
Ping %Address%
If ERRORLEVEL 1 call :RESTART
Ping -n %WaitTime% 127.0.0.1 > Nul
GoTo Loop
:RESTART
taskkill /f /im SW_WiMaxCM.exe > Nul
net stop GCTWiMAXService
devcon disable USB\Class_0a
devcon enable USB\Class_0a
REM devcon disable USB\VID_1076*
REM devcon enable USB\VID_1076*
net start GCTWiMAXService
start /D "C:\Program Files\FreshTel\" SW_WiMaxCM.exe > Nul
exit /b
2 Инсульт:
a) cmdow внешняя утилита, заметил позже
б) Ping %Address% в цикле приводит к ненужному постоянному окну (в XP)
в) нельзя ли вообще без :Loop - проверили и вышли, а повторный запуск через назначенные задания?
a) cmdow внешняя утилита, заметил позже
б) Ping %Address% в цикле приводит к ненужному постоянному окну (в XP)
в) нельзя ли вообще без :Loop - проверили и вышли, а повторный запуск через назначенные задания? »
a) Иначе никак, если это не устраивает можно воспользоваться BAT компилятором, получится exe файл который будет работать как сервис.
в) В этом случае нужно делать планировщик, либо стороннее ПО, или воспользоваться встроенным в систему.
Не поленился написал простенькую программку.
Запускает этот скрипт один раз в 5 минут, а не постоянно пингует.
Скрипт будет работать в скрытом режиме (без окна) как и хотел mrjok
Скрипт теперь должен быть такой:
@Echo Off
Set Address=ya.ru -n 8
Ping %Address%
If ERRORLEVEL 1 call :RESTART
GoTo EXIT
:RESTART
taskkill /f /im SW_WiMaxCM.exe > Nul
net stop GCTWiMAXService
devcon disable USB\Class_0a
devcon enable USB\Class_0a
net start GCTWiMAXService
start /D "C:\Program Files\FreshTel\" SW_WiMaxCM.exe > Nul
exit /b
:EXIT
exit
2 Инсульт:
1) спасибо
2) для devcon как уточнить, что USB\Class_0a
то Инсульт:
Как прописать запуск скрипта в шедулер,планируется поместить шедулер в автозагрузку
Доброго времени суток! Помогите с скриптом! Задача пинговать определенный адрес допустим 192.168.1.100 нужно послать 10 запросов эсли же на 10 запросов нет ответа перезагрузить сервер, если запросы в норме повторить процедуру через 10 минут!
Если конечно возможно то чтобы в момент перезапуска выскакивало окно комп будет перезагружен через 1 минуту, для отмены нажмите допустим "1" не нажал знач перезагруз.
Очень прошу помогите!
art_record_video@vk
10-11-2013, 11:52
Не поленился написал простенькую программку.
Запускает этот скрипт один раз в 5 минут, а не постоянно пингует.
Скрипт будет работать в скрытом режиме (без окна) как и хотел mrjok »
Не поленился написал простенькую программку.
Запускает этот скрипт один раз в 5 минут, а не постоянно пингует.
Скрипт будет работать в скрытом режиме (без окна) как и хотел mrjok »
Не совсем понял, для чего нужен файл Шедулер.ехе, на вин7 64х не запускаеться.
У меня вопрос другого плана, мне надо чтоб скрипт проверял как наличие интернета, так и работоспособность батника, который вызывает работу програмки, иногда эта програмка вылетает (или подвисает или просто вылетает, особенно когда нету интернета долгое время), и хотелось бы , чтоб скрипт перезапускал тот батник, котоырй вылетатет.
То есть два условия проверки, 1 - интернет, 2- работает ли батник.
Как убить процесс и как запустить, - это я логическим путем установил, а вот как сделать проверку программы ? Здесь мозгов не хватает. Работа программы заключаеться в том, что должен работать CMD , который связаный через интернет с сайтом. Если интернет пропадает, то CMD может "вылетить".
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.