Вопрос или проблема
Что действительно раздражает в Ubuntu, так это то, что некоторые приложения, которым не нужны несколько экземпляров, такие как ‘настройки внешнего вида’, веб-браузер, терминал, загружаются снова, когда они уже запущены. Что касается браузера или терминала, я все еще могу понять, хотя такие приложения имеют опцию ‘новое окно’. Но для приложений настроек несколько экземпляров, например ‘Внешний вид’ или ‘Настройки клавиатуры’, совершенно бесполезны.
Как мне предотвратить повторный запуск приложения (например, Firefox) лаунчером, если оно уже запущено?
Я пробовал оболочку под названием launch.sh:
#!/bin/sh
if ! pgrep $1 >/dev/null; then
"$2" &
fi
В лаунчере xfce для Firefox я установил
launch.sh firefox /usr/bin/firefox
что работает (firefox не запускается, когда он уже открыт), но для xfce4-appearance-settings
это не работает, потому что pgrep xfce4-appearance-settings
ничего не возвращает, пока xfce4-appearance-settings открыт.
В macOS это работает правильно: такие приложения запускаются только один раз, и при повторном щелчке на значок приложения оно переходит на передний план, а не запускает новый устаревший экземпляр.
Как это можно реализовать в Ubuntu?
Сама программа контролирует это поведение.
Команда, например, для firefox, которая переключается на запущенное окно и запускает программу только в том случае, если она не запущена, выглядит следующим образом:
wmctrl -x -a firefox || firefox
В bash разделитель команд ||
означает “ИЛИ”. Первая команда, wmctrl
, пытается переключиться на окно WM_CLASS “firefox”. Если это не удается, то выполняется firefox
.
Первый экземпляр firefox
относится к WM_CLASS окна firefox. Вы можете увидеть WM_CLASS запущенных окон в выводе wmctrl -lx
.
Чтобы использовать это для горячей клавиши или в лаунчере .desktop, используйте следующую команду:
sh -c "wmctrl -x -a firefox || firefox"
Опираясь на ответ ванадия, вы можете создать универсальный исполняемый файл, который будет делать это для любого .desktop
файла приложения, эффективно предоставляя вам конфигурацию по желанию.
Создайте файл в вашей домашней папке. Я назвал его switch-to-if-open
. Расширение не требуется.
touch switch-to-if-open.
В вашем любимом текстовом редакторе поместите следующее:
#!/bin/sh
wmctrl -x -a $1 || "$@"
$1
– это имя приложения, а "$@"
выполняет полную команду со всеми дополнительными аргументами, определенными в файле .desktop
, включая кодовые поля (например, url %u
, используемый для firefox).
Сделайте его исполняемым:
sudo chmod +x switch-to-if-open
В вашем .desktop
файле (используя firefox в качестве примера), в разделе [Desktop Entry]
измените:
Exec: firefox %u
на:
Exec: /home/${user}/switch-to-if-open firefox %u
Замените ${user}
здесь своим именем пользователя.
Возможно, вам также захочется сделать это для любых других последующих разделов [Desktop Action ...]
в файле .desktop
, если это применимо.
Если вы хотите использовать это для всех пользователей вашей системы, файл следует разместить в /usr/local/bin
вместо вашей домашней
директории.
Если вы хотите избежать упоминания полного пути, вам нужно быть в состоянии добавить его в ваш $PATH или создать символическую ссылку. Не уверен, волнует ли .desktop
файл, какой метод вы используете.
Вы должны протестировать это с приложениями, которые используют сложные команды с несколькими параметрами и/или код полей, чтобы убедиться, что они все еще ведут себя как ожидается. Я использую рабочий стол GNOME, поэтому использовал gio, чтобы проверить, проходит ли url (%u
код поля). Я считаю, что exo-open можно использовать для той же цели в xfce.
Ответ или решение
Как предотвратить запуск нескольких экземпляров приложений в XFCE на Ubuntu
В операционной системе Ubuntu, использующей рабочее окружение XFCE, пользователи порой сталкиваются с ситуацией, когда приложения, такие как «Параметры внешнего вида», веб-браузеры или терминал, открываются повторно, даже если уже запущены. Это может создавать неудобство, особенно для приложений, где наличие множества экземпляров не имеет смысла.
Чтобы решить эту проблему и предотвратить запуск нескольких экземпляров приложений, вы можете использовать инструменты и скрипты для управления окнами. Одним из таких решений является использование команды wmctrl
, которая позволяет переключаться между окнами, а также запускать приложение только в том случае, если оно еще не запущено.
Шаги по предотвращению открытия нескольких экземпляров приложений
-
Установка wmctrl: Убедитесь, что у вас установлен
wmctrl
. Вы можете установить его с помощью следующей команды:sudo apt-get install wmctrl
-
Создание Shell-скрипта: Создайте простой Shell-скрипт, который будет проверять, запущено ли приложение, и запускать его при необходимости. Откройте терминал и выполните следующие команды:
touch ~/switch-to-if-open chmod +x ~/switch-to-if-open
Затем откройте файл в текстовом редакторе и добавьте следующий код:
#!/bin/sh wmctrl -x -a "$1" || "$@"
Здесь
$1
– это имя приложения, а"$@"
запускает команду с переданными аргументами. -
Модификация .desktop файла: Для того чтобы использовать этот скрипт для конкретного приложения, необходимо изменить .desktop файл приложения. Например, для Firefox файл, расположенный в
/usr/share/applications/firefox.desktop
(или в вашем локальном каталоге), должен выглядеть следующим образом:[Desktop Entry] Name=Firefox Exec=/home/${user}/switch-to-if-open firefox %u Type=Application
Замените
${user}
на ваше имя пользователя. Если вы планируете, что данный скрипт будет использоваться другими пользователями, вы можете переместить его в/usr/local/bin
и заменить путь в.desktop
файле соответственно. -
Проверка работоспособности: Убедитесь, что команда выполняется корректно. Попробуйте запустить приложение и кликая по его значку несколько раз, убедитесь, что оно активируется, а не запускается новый экземпляр.
-
Тестирование для других приложений: Вы можете использовать этот подход и для других приложений, таких как «Параметры клавиатуры», изменив соответствующие
.desktop
файлы.
Заключение
Приведенный способ позволяет контролировать поведение приложений, предотвращая открытие нескольких экземпляров и повышая удобство взаимодействия с рабочим окружением XFCE в Ubuntu. Использование wmctrl
в сочетании с кастомизированными скриптами и изменениями в .desktop
файлах позволит вам настроить свою систему в соответствии с вашими предпочтениями. Такой подход не только упрощает работу, но и делает систему более эффективной в использовании.