¿Cómo evitar abrir una segunda instancia?

¿Cómo evitar abrir una segunda instancia?

Lo configuré lircpara controlar mi PC con un control remoto. Para cambiar entre diferentes modos que edité.lircrccomo sigue:

begin vlc
    include ~/.lirc/vlc
end vlc
begin gnome
    include ~/.lirc/gnome
end gnome
begin firefox
    include ~/.lirc/firefox
end firefox
begin me-tv
    include ~/.lirc/me-tv
end me-tv

begin
    prog = irexec
    button = KEY_YELLOW
    config = if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
    mode = vlc
end
begin
    prog = irexec
    button = KEY_GREEN
    mode = gnome
end
begin
    prog = irexec
    button = KEY_RED
    config = if [ -n $(pgrep -x firefox) ]; then (firefox &); fi
    mode = firefox
end
begin
    prog = irexec
    button = KEY_BLUE
    config = if [ -n $(pgrep -x me-tv) ]; then (me-tv &); fi
    mode = me-tv
end

Todo funciona bien, excepto cambiar a Firefox: cuando Firefox se está ejecutando y presiono el botón rojo, cambia el modo (como debería)y abre una segunda ventana/instancia de Firefox (como no debería).

El problema aparece sólo con Firefox.

EditPreferencesTabsOpen new windows in a new tab insteadya está habilitado:

preferencias de pestañas

Lo que sucedecuando Firefox se está ejecutandoy empiezo firefoxen una terminal?

  • firefox- se abre una segunda ventana
  • firefox about:startpage- se abre una nueva pestaña en Firefox con la página de inicio preconfigurada
  • (!) firefox about:blank- se abre una nueva pestaña en Firefox con mi página de inicio personal (De marcación rápida)
  • firefox chrome://speeddial/content/speeddial.xul (que es la dirección de la página de inicio de Marcación rápida)- no pasa nada

Lo que sucedecuando Firefox no se está ejecutandoy empiezo firefoxen una terminal?

  • firefox- Firefox se abre según lo configurado en Preferences( Show my windows and tabs from last time)
  • firefox about:startpage- Firefox se abre con una nueva pestaña adicional con la página de inicio preconfigurada
  • (!) firefox about:blank- Firefox se abre con una nueva pestaña adicional en blanco.
  • firefox chrome://speeddial/content/speeddial.xul- Firefox no se abre:
    *** Preventing external load of chrome: URI into browser window.
    Use -chrome <uri> instead

Entonces, cuando modifico el comando en el script ( config = ...) y agrego una dirección, about:blankresuelve el problema en parte. Como problema sigue siendo queno pone Firefox en primer planocuando ya está funcionando. esto solo sucedea veces.

¿Alguien podría ayudarme a editar este script para solucionar este mal comportamiento?(Fuentedel guión que modifiqué.)

Respuesta1

Parte del código shell de esofuenteno hace lo que dice hacer; principalmente el tipo que va:

if [ -n $(pgrep -f vlc) ]; then (vlc &); fi

Esto ocurre vlc &en dos casos. Si no hay procesos que coincidan con "vlc" y si hay exactamente un proceso que coincida con "vlc". Si hay más de un proceso que coincida con "vlc", vlc &no se ejecutará. Entonces estos bloques if son bastante inútiles. En su lugar, simplemente ejecutar vlc &probablemente será más correcto.

Desafortunadamente, los malos consejos de shell son comunes en Internet.

Según la descripción de su problema, lo que desea que sea el resultado es que el programa se ejecute si aún no se está ejecutando, y si se está ejecutando, lleve esa ventana al frente y enfóquela. Para ello, wmctrlse podría utilizar.

wmctrl -a 'Mozilla Firefox'Encontrará una ventana que contiene "Mozilla Firefox" en su título y la "activará". Es decir, muévete al espacio de trabajo en el que se encuentra, tráelo al frente y dale foco. En segundo lugar, si ninguna ventana coincide, wmctrl no hará nada y saldrá con un estado de salida distinto de cero (falso), en cuyo caso podemos asumir que el programa no se está ejecutando y, en su lugar, iniciarlo.

wmctrl -a 'Mozilla Firefox' || firefox &

Aunque todavía no es perfecto. Otras ventanas además de Firefox podrían contener esa cadena en su título, por lo que deberíamos encontrar una forma más confiable de identificar la ventana correcta en este caso.

Con -x, wmctrl operará en VM_CLASS de una ventana, que normalmente tendrá un valor único por programa. Todas las ventanas de Firefox tendrán VM_CLASS "Navigator.Firefox", como se puede ver al ejecutarlo wmctrl -lxmientras Firefox se está ejecutando.

$ wmctrl -lx
...
0x03ba3d43  3 gnome-terminal.Gnome-terminal  pilot Terminal
0x04c000bc  0 Navigator.Firefox     pilot Group #1 - Speed Dial - Mozilla Firefox

Con esto podemos seleccionar la ventana que tenga exactamente "Navigator.Firefox" como VM_CLASS

wmctrl -Fxa Navigator.Firefox || firefox &

Es de esperar que lo mismo pueda aplicarse a los demás programas.

información relacionada