Wie vermeide ich das Öffnen einer zweiten Instanz?

Wie vermeide ich das Öffnen einer zweiten Instanz?

Ich habe lircmeinen PC mit einer Fernbedienung gesteuert. Um zwischen verschiedenen Modi zu wechseln, habe ich.lircrcwie folgt:

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

Damit funktioniert alles einwandfrei - außer der Wechsel zu Firefox: Wenn Firefox läuft und ich den roten Knopf drücke, wechselt er den Modus (wie es sein sollte)Und öffnet ein zweites Fenster/eine zweite Instanz von Firefox (was nicht der Fall sein sollte).

Das Problem tritt nur bei Firefox auf.

EditPreferencesTabsOpen new windows in a new tab insteadist bereits aktiviert:

Registerkarteneinstellungen

Was geschiehtwenn Firefox läuftund ich starte firefoxin einem Terminal?

  • firefox- ein zweites Fenster öffnet sich
  • firefox about:startpage- es öffnet sich ein neuer Tab in Firefox mit der vorkonfigurierten Startseite
  • (!) firefox about:blank- es öffnet sich ein neuer Tab in Firefox mit meiner persönlichen Startseite (Kurzwahl)
  • firefox chrome://speeddial/content/speeddial.xul (das ist die Adresse der Speeddial-Startseite)- nichts passiert

Was geschiehtwenn Firefox nicht läuftund ich starte firefoxin einem Terminal?

  • firefox- Firefox öffnet sich wie in Preferences( Show my windows and tabs from last time) konfiguriert
  • firefox about:startpage- Firefox öffnet sich mit einem zusätzlichen neuen Tab mit der vorkonfigurierten Startseite
  • (!) firefox about:blank- Firefox öffnet sich mit einem zusätzlichen neuen, leeren Tab
  • firefox chrome://speeddial/content/speeddial.xul- Firefox öffnet sich nicht:
    *** Preventing external load of chrome: URI into browser window.
    Use -chrome <uri> instead

Wenn ich also den Befehl im Skript ändere ( config = ...) und eine Adresse hinzufüge, about:blanklöst das das Problem teilweise. Das Problem bleibt, dass essetzt Firefox nicht in den Vordergrundwenn es bereits läuft. Dies geschieht nurManchmal.

Kann mir jemand helfen, dieses Skript zu bearbeiten, um dieses Fehlverhalten zu beheben?(Quelledes Skripts, das ich geändert habe.)

Antwort1

Ein Teil des Shell-Codes davonQuellehält nicht, was es verspricht; vor allem nicht die Art, die so geht:

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

Dies wird vlc &in zwei Fällen ausgeführt. Wenn es keine Prozesse gibt, die mit „vlc“ übereinstimmen, und wenn es genau einen Prozess gibt, der mit „vlc“ übereinstimmt. Wenn es mehr als einen Prozess gibt, der mit „vlc“ übereinstimmt, vlc &wird es nicht ausgeführt. Daher sind diese if-Blöcke ziemlich nutzlos. vlc &Stattdessen einfach auszuführen wäre wahrscheinlich korrekter.

Schlechte Shell-Ratschläge sind im Internet leider an der Tagesordnung.

Aus Ihrer Problembeschreibung geht hervor, dass das gewünschte Ergebnis darin besteht, dass das Programm ausgeführt wird, wenn es nicht bereits ausgeführt wird, und dass das Fenster, wenn es ausgeführt wird, in den Vordergrund gebracht und fokussiert wird. Zu diesem Zweck wmctrlkönnte verwendet werden.

wmctrl -a 'Mozilla Firefox'findet ein Fenster mit „Mozilla Firefox“ im Titel und „aktiviert“ es. Das heißt, es wechselt in den Arbeitsbereich, in dem es sich befindet, bringt es in den Vordergrund und gibt ihm den Fokus. Zweitens, wenn keine Fenster übereinstimmen, tut wmctrl nichts und beendet das Programm mit einem Exit-Status ungleich Null (falsch). In diesem Fall können wir davon ausgehen, dass das Programm nicht ausgeführt wird, und es stattdessen starten.

wmctrl -a 'Mozilla Firefox' || firefox &

Es ist jedoch immer noch nicht perfekt. Auch andere Fenster als Firefox-Fenster könnten diese Zeichenfolge möglicherweise in ihrem Titel enthalten, daher sollten wir in diesem Fall einen zuverlässigeren Weg finden, das richtige Fenster zu identifizieren.

Mit -x wird wmctrl auf der VM_CLASS eines Fensters arbeiten, die normalerweise einen eindeutigen Wert pro Programm hat. Alle Firefox-Fenster haben die VM_CLASS „Navigator.Firefox“, wie man sehen kann, wenn man es ausführt, wmctrl -lxwährend Firefox läuft.

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

Damit können wir das Fenster auswählen, das genau "Navigator.Firefox" als VM_CLASS hat

wmctrl -Fxa Navigator.Firefox || firefox &

Gleiches dürfte hoffentlich auch für die anderen Programme gelten.

verwandte Informationen