Batch, reiniciar programa luego que detecte que no haya Internet

Iniciado por BALTA00, 19 Abril 2016, 05:11 AM

0 Miembros y 2 Visitantes están viendo este tema.

BALTA00

Buenas noches, tengo un programa que hace función de Proxy, trabaja perfecto, pero cuando tengo problemas de conexión si se me va y llega el Internet el proxy deja de reconectar, para evitar eso, hice lo siguiente:

@echo off
:inicio
if exist testigo.txt del testigo.txt
set ERRORLEVEL =
ping -n 1 www.google.com > testigo.txt
rem La solicitud de ping no pudo encontrar el host
echo Comprobando conectividad ...
@find /C "La solicitud de ping no pudo encontrar el host" testigo.txt > null
rem find /C "recibidos = 0" testigo.txt

rem si errorlevel = 0  ha encontrado recibidos=0 lo cual indica que no hay conectivida
if %ERRORLEVEL%==0  goto reiniciar else goto continua


:continua
color 17
echo Si hay conectividad     
rem delay de 60seg
@ping -n 15 127.0.0.1 > null
goto inicio
     
:reiniciar
color 16
echo Se fue el Internet
echo Esperando que llegue para reiniciar el proxy
if exist testigo.txt del testigo.txt
set ERRORLEVEL =
ping -n 1 www.google.com > testigo.txt
rem La solicitud de ping no pudo encontrar el host
echo Comprobando conectividad ...
@find /C "La solicitud de ping no pudo encontrar el host" testigo.txt > null
rem find /C "recibidos = 0" testigo.txt
rem si errorlevel = 1  ha encontrado recibidos=1 lo cual indica que ya hay Internet
if %ERRORLEVEL%==1  goto restablecer else goto reiniciar

:restablecer
TASKKILL /IM eth-proxy.exe /F
echo ETH-Proxy cerrado, esperenmos 3 segundos y lo abriremos de nuevo
timeout /t 3 /nobreak

START "ETH-Proxy" "eth-proxy.exe"
goto inicio


Se supone que debería chequear cada minuto si hay conexión, sino hay conexión pasa a la sentencia reiniciar, que ahí debería chequear cuando llegue la conexión, y en lo que llegue debería matar el proceso eth-proxy.exe y volverlo a iniciar, y continuar chequeando si hay o no conexión, el detalle es que no me funciona, simplemente abra y cierra el proceso de manera continua, ¿Qué estoy haciendo mal?

Zomkar

Usa el programador de tareas mejor para ejecutar cada X tiempo. Para saber si hay conexion puedes usar goto+if+https://stackoverflow.com/questions/9329749/batch-errorlevel-ping-response

Aparte, no habrá alguna forma de que los ping vayan a traves del proxy? O comprobar de otra forma que use el proxy? Asi no matarias el proceso cuando no fuese necesario.
Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

BALTA00

Cita de: Zomkar en 19 Abril 2016, 06:12 AM
Usa el programador de tareas mejor para ejecutar cada X tiempo. Para saber si hay conexion puedes usar goto+if+https://stackoverflow.com/questions/9329749/batch-errorlevel-ping-response

Aparte, no habrá alguna forma de que los ping vayan a traves del proxy? O comprobar de otra forma que use el proxy? Asi no matarias el proceso cuando no fuese necesario.

Encontré una forma, acabo de editar el post, ahora necesito ayuda porque no funciona lo que hice...

Zomkar

#3
No veo fallos, pero puedes probar a detectar donde están usando pause y echo, si no se llega a ejecutar o falla en algun punto. Si es otro problema, que error te da?

Por otra parte la cosa seria:

:comprobar conexion
si hay conexion goto continuar else goto reiniciar

:continuar
(esperar y comprobar conexion)

:reiniciar
matar tarea y iniciarla
goto: comprobar conexion


De esta forma  simplificas el codigo, solo hay que comprobar conexion una vez. La funcion que pusiste que detecta si ya hay internet la quitaria ya que si no hay internet tampoco es un problema que mates el proceso.

PD: he visto algo
@find /C "La solicitud de ping no pudo encontrar el host" testigo.txt > null

Esto no funcionará si ping da este mensaje:
Tiempo de espera agotado para esta solicitud.

Deberías usar el que tienes justo debajo el de "recibidos = 0" que tiene REM delante (comentario).
Aparte quita los "set ERRORLEVEL=", no es necesario y se desaconseja:
Citar
You should never attempt to write to the %ERRORLEVEL% variable because the value you set will then take precedence over the internal ERRORLEVEL.
http://ss64.com/nt/errorlevel.html
Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

BALTA00

Así como dices:
@echo off
:inicio
if exist testigo.txt del testigo.txt
set ERRORLEVEL =
ping -n 1 www.google.com > testigo.txt
rem La solicitud de ping no pudo encontrar el host
echo Comprobando conectividad ...
@find /C "La solicitud de ping no pudo encontrar el host" testigo.txt > null
rem find /C "recibidos = 0" testigo.txt

rem si errorlevel = 0  ha encontrado recibidos=0 lo cual indica que no hay conectivida
if %ERRORLEVEL%==0  goto reiniciar else goto continua

:continua
color 17
echo Si hay conectividad     
rem delay de 1min
@ping -n 60 127.0.0.1 > null
goto inicio
     
:reiniciar

TASKKILL /IM eth-proxy.exe /F
echo ETH-Proxy cerrado, esperenmos 3 segundos y lo abriremos de nuevo
timeout /t 3 /nobreak

START "ETH-Proxy" "eth-proxy.exe"
goto inicio


funciona, solo que cuando no hay conexión cierra y abre el proceso constantemente, no es en realidad un problema muy grande, pero es medio incómodo.

Zomkar

Mmmm y si le aumentas el valor de:
timeout /t 3 /nobreak

Y sino, puedes poner un ping -n >nul.
O más facil, al final de :reiniciar pon goto continua.

Si quieres que realmente solo lo mate en cuanto vuelva la conexion si que tendrias que hacerlo de una forma similar a como lo tenias.

:reiniciar
esperar X segundos
Si no hay conexion goto reiniciar
matar tarea
goto inicio

El resto de codigo seria el mismo, tendrias que volver a copiar la funcion comprobar conexion aqui, así creas un bucle del que se sale si hay conexion.
Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

Eleкtro

Citar
Código (dos) [Seleccionar]
set ERRORLEVEL =
Eso es totalmente inapropiado y erroneo, es un claro ejemplo de malas prácticas de uso.


  • La variable ERRORLEVEL ya está definida de forma nativa, es una variable dinámica, no necesitas redeclararla.
  • Si declaras una variable usando un mismo nombre de variable dinámica, lo único que vas a conseguir es sustituir la variable dinámica por tu variable local (por lo que jamás obtendrás el valor de la variable dinámica).
  • Entre el nombre de la variable y el símbolo de asignación de valor (=) no debe existir ningún espacio, por que de lo contrario ese espacio se suma al nombre de tu variable, esto quiere decir que el nombre real de tu variable es "ERRORLEVEL ", no "ERRORLEVEL". Esto quiere decir además que en tu código nunca estás accediendo a tu variable local, sino a la variable dinámica.
  • Aparte de lo mencionado, deberías encerrar entre comillas dobles el nombre y el valor de la variable para prevenir otros tipos de errores (de sintaxis):
Código (dos) [Seleccionar]
Set "Var=Value"

    (lo mismo se aplica a variables numéricas)[/li]

En resumen, debes eliminar esa variable, por que aparte de no necesitarla tampoco le estás dando ningún uso (ni podrías dárselo correctamente con la intención de sustituir la variable dinámica y aun así esperar obtener el mismo valor...)

Saludos.