2010-02-26 14 views
5

Cuando comienzoInicio y detención de Firefox desde C#

/Applications/Firefox.app/Contents/MacOS/firefox-bin

en MacOSX usando Process.Start() usando Mono, el id del proceso que se devuelve no coincide con el proceso por el que Firefox termina corriendo.

Parece que Firefox rápidamente decide comenzar otro proceso y matar el actual.

Esto hace que sea difícil detener Firefox y detectar si aún se está ejecutando. Intenté iniciar Firefox usando la bandera -no-remote, pero no sirvió para nada.

¿Hay alguna manera de iniciar Firefox de forma tal que no haga este baile "Voy a hacer un nuevo proceso para ti" rápidamente?

La situación se puede detectar de alguna manera asegurándose de que Firefox sigue funcionando durante al menos 3 segundos después de su inicio, y cuando no lo hace, busca otros procesos de Firefox. Sin embargo, esta técnica es inestable en el mejor de los casos, ya que en días lentos puede demorar un poco más de 3 segundos y luego fallan todas las pruebas que dependen de este comportamiento.

Resulta que este comportamiento solo ocurre cuando se solicita a Firefox que inicie un perfil específico usando -P MyProfile. (Lo que tengo que hacer, ya que necesito iniciar Firefox con configuraciones específicas de proxyserver). Si inicio Firefox "normalmente", se mantiene en su proceso.

+0

Tenga en cuenta que si ya se está ejecutando una instancia, probablemente verá el mismo comportamiento. Al parecer, Firefox no le gusta demasiado los procesos múltiples, por lo que decide incluir todas las ventanas en un único proceso, lo que hace que los accidentes sean mucho más divertidos :) – Joey

+0

En el peor de los casos, use otro navegador;) –

Respuesta

3

Cuando se utiliza Mozilla programación/incrustar en otras aplicaciones que puedes usar los componentes proporcionados:

"de la manera correcta" según lo recomendado por Mozilla ...

https://developer.mozilla.org/en/XPCOM

"La manera fácil" , consenso general de Mozilla chicos dev ...

http://www.iol.ie/~locka/mozilla/control.htm

N Para "ejecutar procesos", simplemente crea una instancia del componente y habla con eso, entonces deberás tener todo lo que necesites.

Sin embargo ...

Si realmente insiste en cuidar el proceso real para una instancia de Firefox, es posible que desee llamar

Process.Start ("... \ firefox.exe");

Entonces prueba esto (creo que esto también funciona en MAC OS) ...

C#/mono: get list of child processes on Windows and Linux

El patrón básico idea/pensamiento es que si de hecho es la ejecución de otro proceso de inmediato que debe ser capaz de encontrar que a medida que sería un proceso de "niño" en lugar de ser sólo uno de una lista en la "lista de tareas"/administrador de procesos para la máquina.

0

En caso de que esté de acuerdo con la detección del proceso de Firefox, pero no sabe cuándo debe comenzar la detección, puede utilizar el evento Process.Exited. No olvide establecer primero EnableRaisingEvents.

0

Sugiero tomar un enfoque diferente: enumerar todos los procesos en ejecución, encontrar Firefox, obtener su identificación de proceso y (opcional) ver si es el que usted inició.

No estoy seguro de si hay una forma de plataforma independiente para lograr esto. En Linux, puede llamar a "ps-ef" para listarlos, en Windows se llama "lista de tareas".

0

No tengo una Mac, así que no estoy seguro, pero si se trata de Linux, el 'binario' de Firefox es en realidad una secuencia de comandos que configura una serie de variables de entorno requeridas y comprueba si es Firefox ya se está ejecutando (si es así, intentará y agregará una nueva pestaña a la instancia existente, hasta donde yo sé).

Puede capturar el nuevo PID dentro del script, aunque si lo actualiza tenga cuidado de que se sobrescriba durante las actualizaciones.

Cuestiones relacionadas