Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Перезапуск программы при пропадании интернета.

Ответить
Настройки темы
CMD/BAT - Перезапуск программы при пропадании интернета.

Аватара для Инсульт

Ветеран


Сообщения: 981
Благодарности: 159


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Задача такая: Есть коннект менеджер для 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" скрипт останавливается.

-------
Debugged programm was unable to process exception. Terminating...


Отправлено: 13:34, 18-12-2011

 

Пользователь


Сообщения: 148
Благодарности: 39

Профиль | Сайт | Отправить PM | Цитировать


Теоретически "Сетевые виджеты" получают информацию о загруженности канала. Если бы можно было получать такую информацию посредством батника...

-------
Alex Dragokas


Отправлено: 18:09, 19-12-2011 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Может так-то можно по этим параметрам идентифицировать отсутствие сети?
Сеть есть и сети нет сооответственно:


Код: Выделить весь код
Настройка протокола 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 включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да

Отправлено: 21:22, 19-12-2011 | #22


Аватара для Инсульт

Ветеран


Сообщения: 981
Благодарности: 159

Профиль | Сайт | Отправить PM | Цитировать


Цитата YouHim:
Инсульт, а у вас просто обрывы связи или сам модем подвисает? Когда связь пропала, можно подключиться через коннект менеджер, или нужно обязательно перетыкать модем? »
Нет, не виснет модем. Просто отключается с ошибкой "неправильный логин\пароль" И сам не подключается пока не нажмешь "подключить". И так довольно часто, бывает 10 раз в час. Если что то качать например фильм надо сидеть контролировать что не очень удобно.

Не проще через WMI определять подключен адаптер к сети или нет?
Вот как бы в скрипте увеличить время пинга ya.ru а то 4 запроса мало. Если и правда интернет временно затупил изза торрента или еще чего что бы не перезагружался зря.
Как то все сложно выходит. Проще скрипт на autoit сделать что бы нажимал кнопку "подключиться"

-------
Debugged programm was unable to process exception. Terminating...


Отправлено: 21:31, 19-12-2011 | #23


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Инсульт:
Не проще через WMI определять подключен адаптер к сети или нет? »
Знать бы как это сделать... Я в этом, к сожалению, ничего не смыслю.
Кстати, винда сообщает, что соединение нерабочее, хотя коннект менеджер показывает противоположное. Вот по этому параметру можно было бы и запускать скрипт.


UPD: вот скрипт, который, выдает статус адаптера. http://forum.oszone.net/post-1810790-86.html
Переделать бы его..

Последний раз редактировалось YouHim, 19-12-2011 в 21:59.


Отправлено: 21:35, 19-12-2011 | #24


Пользователь


Сообщения: 148
Благодарности: 39

Профиль | Сайт | Отправить PM | Цитировать


Если Вам приемлимо использовать стороннее freeware ПО, то могу предложить еще способ с linux-утилитой wget, переписанной под Win:
Скачать Wget
Она лишена недостатков со сбоями, как в 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
Если нужно, могу дописать и чтобы
Цитата YouHim:
пропингует, например, 3 сайта по 10 пингов? Если ни один пинг не прошел, только тогда выполнить переподключение. »
Цитата YouHim:
Переделать бы его.. »
Переделать - 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

-------
Alex Dragokas


Последний раз редактировалось Dragokas, 20-12-2011 в 00:55.


Отправлено: 00:23, 20-12-2011 | #25


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Diskretor:
вот там, где Вы подчеркнули 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, спасибо. Попробую и ее поковырять на досуге.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:02, 20-12-2011 | #26


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Diskretor:
Вы уверены, что при обрыве связи указанный скрипт 100% без ошибок меняет это значение на disconnected? »
К сожалению, ваши предчувствия оправдались. При реальном обрыве ничего не меняется. Статус сети так и висит "подключено". Получается, что локально зафиксировать проблему никак нельзя. Только пинговать... Но пинги тоже не спасают. Я в тупике.

Отправлено: 10:47, 20-12-2011 | #27


Пользователь


Сообщения: 148
Благодарности: 39

Профиль | Сайт | Отправить PM | Цитировать


Есть такая команда "netstat -s" если ее запустить дважды через секундный интервал, то имеем количество полученных за это небольшое время пакетов:
Алгоритм:
1) 5 последовательных Ping --> все fail AND Packets > 1000 - ничего не делаем (канал перегружен прогой Utorrent)
1) 5 последовательных Ping --> все fail AND Packets <= 50 - Restart Modem

Есть только один недостаток, если у Вас несколько LAN-ов, или работает локальная сеть этот метод будет работать неправильно (а фильтра устройств в этой команде я не нашел).

-------
Alex Dragokas


Отправлено: 12:22, 20-12-2011 | #28


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Цитата YouHim:
Но пинги тоже не спасают »
Подозреваю, это связано с тем, что 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, а затем проверять на наличие файла (ключами указать несколько попыток и достаточный таймаут)

Последний раз редактировалось Anonymоus, 20-12-2011 в 12:28.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:23, 20-12-2011 | #29


Новый участник


Сообщения: 16
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Diskretor:
Есть такая команда "netstat -s" если ее запустить дважды через секундный интервал, »
Кажись понял идею. Попробую.
Anonymоus, Извиняюсь, но ничего не понял... Можно как для ламера разжевать?

Отправлено: 21:51, 20-12-2011 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Перезапуск программы при пропадании интернета.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Автоматический перезапуск программы alleo Microsoft Windows 2000/XP 12 24-05-2012 21:39
Перезапуск программы alleo AutoIt 9 21-02-2011 20:25
Прочее - Автоматический перезапуск интернета DJ@XON Сетевые технологии 2 30-06-2010 17:39
CMD/BAT - Перезапуск explorer'а при наличии определённого запущенного приложения Habetdin Скриптовые языки администрирования Windows 2 30-05-2009 17:30
Автоматический перезапуск программы. tueur Программное обеспечение Windows 9 21-09-2004 17:59




 
Переход