Как избежать открытия второго экземпляра?

Как избежать открытия второго экземпляра?

Я настроил lircуправление ПК с помощью пульта дистанционного управления. Для переключения между различными режимами я отредактировал.lircrcследующее:

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

Все работает отлично, за исключением переключения на Firefox: когда Firefox запущен и я нажимаю красную кнопку, он переключает режим (как и должно быть)и открывает второе окно/экземпляр Firefox (чего не должно быть).

Проблема возникает только с Firefox.

EditPreferencesTabsOpen new windows in a new tab insteadуже включено:

настройки вкладок

Что происходиткогда Firefox запущени я начинаю firefoxв терминале?

  • firefox- открывается второе окно
  • firefox about:startpage- в Firefox открывается новая вкладка с предварительно настроенной стартовой страницей
  • (!) firefox about:blank- в Firefox открывается новая вкладка с моей личной стартовой страницей (Быстрый набор)
  • firefox chrome://speeddial/content/speeddial.xul (это адрес стартовой страницы Speeddial)- Ничего не произошло

Что происходиткогда Firefox не запущени я начинаю firefoxв терминале?

  • firefox- Firefox открывается, как настроено в Preferences( Show my windows and tabs from last time)
  • firefox about:startpage- Firefox открывается с дополнительной новой вкладкой с предварительно настроенной стартовой страницей
  • (!) firefox about:blank- Firefox открывается с дополнительной новой пустой вкладкой
  • firefox chrome://speeddial/content/speeddial.xul- Firefox не открывается:
    *** Preventing external load of chrome: URI into browser window.
    Use -chrome <uri> instead

Итак, когда я изменяю команду в скрипте ( config = ...) и добавляю адрес, как about:blankэто решает проблему частично. Поскольку проблема остается, что этоне выводит Firefox на передний планкогда он уже запущен. Это происходит толькоиногда.

Может ли кто-нибудь помочь мне отредактировать этот скрипт, чтобы исправить это неправильное поведение?(Источник(Скрипта, который я изменил.)

решение1

Часть кода оболочки оттудаисточникне делает то, что заявлено; в основном это тот тип, который:

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

Это выполняется vlc &в двух случаях. Если нет процессов, соответствующих "vlc", и если есть ровно один процесс, соответствующий "vlc". Если есть более одного процесса, соответствующего "vlc", vlc &не будет запущено. Так что эти блоки if довольно бесполезны. Просто запуск vlc &вместо этого, вероятно, будет более правильным.

К сожалению, в Интернете часто можно встретить плохие советы по использованию оболочки.

Из описания вашей проблемы следует, что вы хотите, чтобы программа запускалась, если она еще не запущена, а если запущена, выносила это окно на передний план и давала ему фокус. Для этого wmctrlможно использовать.

wmctrl -a 'Mozilla Firefox'найдет окно, содержащее "Mozilla Firefox" в заголовке, и "активирует" его. То есть, переместится в рабочую область, в которой оно находится, выведет его на передний план и даст ему фокус. Во-вторых, если ни одно окно не соответствует, wmctrl ничего не сделает и выйдет с ненулевым (ложным) статусом выхода, в этом случае мы можем предположить, что программа не запущена, и вместо этого запустить ее.

wmctrl -a 'Mozilla Firefox' || firefox &

Но это все еще не идеально. Другие окна, помимо окон Firefox, потенциально могут содержать эту строку в своем заголовке, поэтому нам следует найти более надежный способ определения нужного окна в этом случае.

С -x wmctrl будет работать с VM_CLASS окна, который обычно имеет уникальное значение для каждой программы. Все окна Firefox будут иметь VM_CLASS "Navigator.Firefox", как можно увидеть, запустив его wmctrl -lxво время работы Firefox

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

С помощью этого мы можем выбрать окно, которое имеет именно «Navigator.Firefox» в качестве VM_CLASS.

wmctrl -Fxa Navigator.Firefox || firefox &

То же самое, как мы надеемся, будет применимо и к другим программам.

Связанный контент