Página 1 de 1

reiniciar un programa

Publicado: 30 Mar 2009, 16:31
por Jonny
Hola

Estoy intentando hacer, que el servidor en el que estoy trabajando contemple la posibilidad de administrarlo de forma remota además de local.

De esta forma si no me encuentro delante de la máquina en la que esté instalado puedo realizar algunas tareas de mantenimiento sobre el mismo.

Bien, he empezado por el comando "Restart" cuya función es reiniciar el servidor (como lo hace por ejemplo apache).
ya está terminado el código de éste comando, que antes de reiniciar el servidor realiza algunas comprobaciones a nivel de seguridad (password para la administración remota etc)
pero al hacer que por fin se reinicie la aplicación me encuentro con un problema:
si la aplicación se cierra, como es lógico no podrá auto iniciarse nuevamente (o eso creo) jejejeje.

Entonces, la solución que le dí pasó por hacer un programa independiente, que al ejecutarlo llamara al servidor.
De esta forma el servidor antes de cerrarse llama a éste mini-programa y se cierra. una vez se detecta en la otra aplicación que el servidor se cerró (mediante el proceso) se le llama para iniciarlo nuévamente y se cierra el programa auxiliar.

Una vez planteada la teoría, lo puse en práctica, no parecía ser muy difícil. Pero me encontré con que no hay forma de hacerlo funcionar.
Misteriosamente este código no funciona como debiera (ejecutar el programa auxiliar y cerrarse la aplicación).

Código: Seleccionar todo

Run(ScriptDir&"\restart.exe", "", @SW_HIDE)
Exit
Restart.exe se ejecuta, pero el programa que lo llama no se cierra.
Si quitamos la llamada a Restart.exe el programa se cierra sin problema.

(No pongo el código completo, sería inhumano pues ocupa muchíiiiiiisimo) y no creo que nadie vaya a analizarlo :P.
¿Alguien sabe porque ocurre esto?
lo hice así porque no se me ocurre otra forma, que si la hay será bien recibida.

Salu2!

Re: reiniciar un programa

Publicado: 30 Mar 2009, 19:52
por Nahuel
Y por qué no:

Código: Seleccionar todo

$Key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
RegWrite($Key,"Servidor","REG_SZ",@ScriptFullPath)
Antes de reiniciar?
O sea, que el programa que reinicia se escriba a si mismo en el registro para que una vez que el sistema inicie de nuevo, ejecute lo que querés que se ejecute.

Re: reiniciar un programa

Publicado: 30 Mar 2009, 20:14
por Jonny
Hola

Gracias por la respuesta.

No es exactamente así, necesito que se pueda reiniciar el programa sin necesidad de reiniciar la máquina.

Para Recoger cambios en la configuración etc.

Salu2!

Re: reiniciar un programa

Publicado: 30 Mar 2009, 21:03
por Nahuel
Claro, que tonto.

Yo no veo nada malo con la linea que posteaste. Quizás el problema esté en el programa restart.exe.

Está bien tu idea. Llamar a una aplicación auxiliar que reinice el programa y salga. Yo lo haría algo así:

Restart.exe:

Código: Seleccionar todo

$Proceso = "notepad.exe"
$Ruta = @SystemDir & "\notepad.exe"

Do
	Sleep(500)
Until Not ProcessExists($Proceso)

Run($Ruta)
Si ejecutás notepad y luego este script, verás que al cerrar notepad se vuelve a abrir.

Si llamas desde tu programa a Restart.exe, éste último va a esperar que el programa que lo llamó (siempre y cuando le indiques qué programa lo llamó) se cierre para abrirlo nuevamente. Probablemente se te está pasando por alto algo muy básico, a todos nos pasa todo el tiempo. :smt001

Re: reiniciar un programa

Publicado: 30 Mar 2009, 22:53
por Chefito
Jajajaja.....con tanto apagar...encender....apagar...no me aclaro :smt033 . No entiendo muy bien lo que quieres, pero recuerda una cosa....cuando falla el comando Run, utiliza al Rey, ShellExecute. Espero que te sirva de algo.

Saludos.

Re: reiniciar un programa

Publicado: 30 Mar 2009, 23:03
por Jonny
Hola
jejejje
sí... es un poco lío ¿No?

Verás.

quiero, que el servidor que estoy haciendo pueda reiniciarse.
Para así, poder por ejemplo, cargar una nueva configuración o alguna actualización... etc.

Para ello, dado que no puede hacerse directamente en el mismo servidor ya que, si se cierra la aplicación no puede volver a ejecutarse por sí misma, he creado un programa auxiliar, que llamé Restart.exe.
de esa manera el servidor llama a restart.exe y debería cerrarse, ya que tras el run correspondiente puse un exit...
Una vez cerrado el servidor,Restart.exe seencarga de volver a ejecutar el servidor (server.exe)
la cosa está, en que misteriosamente server.exe no se cierra tras llamar a restart.exe, por lo que no se reinicia, simplemente queda Restart.exe en espera de que se cierre el servidor.

No creo que sea cosa de restart.exe, pues es un programa independiente qe nada tiene que ver (en teoría)


Decir, que lo llamo así:

Run(@Comspec&" /c restart.exe", "", @SW_HIDE)
lo digo, porque no se si tendrá algo que ver, aunque si lo llamo sin @comspec tampoco funciona.

Shellexecute? ¿como se llamaría a un programa con esa fnción? nunca la utilicé.

Gracias,

Salu2!

Re: reiniciar un programa

Publicado: 02 Abr 2009, 00:44
por Chefito
Mmmmm.....ya me conoces y sabes lo que te voy a decir....1º hay que mirar en la ayuda :smt005 .
La definición de esa función es:
ShellExecute ( "filename" [, "parameters" [, "workingdir" [, "verb" [, showflag]]]] )
Un ejemplo sería:

Código: Seleccionar todo

ShellExecute("cmd.exe","/c dir /?",@SystemDir)
No creo que haga falta que te explique los parámetros no? Si por casualidad dudas en alguno dimelo.

En tu caso, sería algo así:

Código: Seleccionar todo

ShellExecute("cmd.exe","/c restart.exe",@SystemDir,"",@SW_HIDE)
Espero que tengas suerte y no se atasque :smt001 .

Saludos.

Re: reiniciar un programa

Publicado: 02 Abr 2009, 11:53
por Jonny
Hola
jijiji
sí, suponía que me lo dirías...

Lo probaré a ver que tal funciona. De momento lo solucioné cerrando el proceso directamente en el punto en que quiero que se cierre el programa (que bruto ¿Verdad? jejeje pero así sí funciona.
una curiosidad. aparentemente, ShellExecute() y run() hacen lo mismo... ¿Dónde está la diferencia entre una función y otra?

Lo digo, porque si con run el programa se pasa por alto el "Exit" quizá también lo haga con Shell execute.

De todas formas, es muy raro que no funcione, porque si después de "Exit" pongo por ejemplo un Msgbox() se ejecuta normalmente.

Salu2!

Re: reiniciar un programa

Publicado: 05 Abr 2009, 15:11
por Chefito
Supongo que la diferencia está en la forma de iniciar un proceso :smt017 . La función ShellExecute utiliza la api de win que tiene este mismo nombre. La función Run si te digo la verdad no se que utilizará :smt017 .
Se tienen que diferenciar en algo seguro, porque a mi algunas veces no me ha funcionado Run del todo bien y en cambio ShellExecute sí. También se diferencian algo en sus parámetros. Comparalos y verás que ShellExecute tiene alguno más.

También hay otra posibilidad, aunque teniendo las dos anteriores no creo que hiciese falta, y es utilizar el comando de consola en modo oculto Start.

Saludos.