Как знать, открыта ли определенная программа

Короткий: нет решения (ТМ) для того, что Вы хотите.

Однако с достаточным знанием о Вашей установке может быть возможно разработать решение, которое работает на Вас. У меня была та же проблема однажды.

Причина, почему это столь трудно, состоит в том, что Xserver точно не связывается с пользователем. Можно подтвердить это на любом главном дистрибутиве Linux путем вхождения в систему настольной среды по Вашему выбору, открытия терминала и ввода ps faux. Это покажет Вашему менеджеру по оформлению с (по крайней мере) двумя дочерними процессами: xserver и родительский процесс для всех процессов, принадлежащих Вашему сеансу пользователя. Обратите внимание, что xserver запускается как пользовательский корень и НЕ как пользователь, которому принадлежит Ваша сессия.

Что я сделал для соответствия определенному xserver имени пользователя, я делаю решение большинством голосов: Я смотрю на каждый пользовательский процесс и проверяю, с которым xserver он подключен. От того знания я создаю список, который говорит мне для каждого пользователя объем процессов, которые подключены к определенному xserver. Иллюстрация этой таблицы могла быть похожей на это:

      |xserver :1| xserver :2 | xserver :3 | xserver :4
-------------------------------------------------------------
alice |    17    |      0     |      0     |       0
bob   |     0    |      0     |     14     |       0
eve   |     0    |     34     |      1     |       0
foo   |     1    |      1     |      1     |       8

С этой таблицей я выполняю голосование простым большинством, которое приводит к отображению:

  • Пользователь alice использует, т.е. сидит впереди xserver:1
  • Пользовательский боб использует xserver:3
  • Пользовательский канун использует xserver:2
  • Пользовательское нечто использует xserver:4

Это решение большинством голосов не обязательно приводит к корректным отображениям однако для всех моих намерений и целей, это достаточно.

Это - все, в чем Вы нуждаетесь. Теперь Вы можете

DISPLAY=<ip.to.xserver>:1 xmessage -buttons yes,no,maybe -nearmouse "Do you want to go on a date with me?"

попросите у alice даты.

Волшебство является переменной окружения ДИСПЛЕЯ, какое использование xapplications узнать, с каким xserver они должны соединиться. Большинство xapplications также принимает опцию -display. См. страницу справочника на xmessage и X.

Конечно, существуют (так) много других способов заменить мое решение большинством голосов. Который является самым подходящим для Вас, необходимо узнать себя...

1
06.06.2013, 00:31
3 ответа
xwininfo -root -children | grep -q '"Firefox")'
echo "$(($? == 0))"

Произвел бы 1, если существует окно класса Firefox подключенный к Вашему X-серверу (любым пользователем от любой машины).

Ограничить Firefox обрабатывает локальный для машины, куда Вы выполняете ту команду:

xwininfo -root -children |
  awk '/"Firefox"\)/{print $1}' |
  xargs -I% xprop -id % WM_CLIENT_MACHINE |
  cut -d\" -f2 |
  grep -qFx "$(uname -n)"

Поиск именем процесса не дает Вам гарантии, что процессы на самом деле отображают свое окно на Вашем X-сервере.

Метод, описанный выше, согласовывается с тем, как Firefox проверяет на в настоящее время под управлением Firefox при отсутствии передачи --no-remote опция.

2
27.01.2020, 23:17

pgrep -x chromium не соответствовал бы именам процесса как chromium-foo, и > /dev/null мог быть заменен -q:

pgrep -xq chromium; echo $(($? == 0))

pgrep не определяется POSIX, и например он не был включен с OS X до недавнего времени. Но Вы могли также использовать ps:

ps -eo comm= | grep -xq chromium; echo $(($? == 0)) # GNU
ps -eco comm= | grep -xq chromium; echo $(($? == 0)) # OS X
ps -eo comm= | sed 's|.*/||' | grep -xq chromium; echo $(($? == 0)) # either

В OS X -o comm печатает полные пути команд и -co comm базовые имена печати. В GNU -o comm базовые имена печати и -c не определяется.

2
27.01.2020, 23:17
  • 1
    Ваши команды содержат броские опции, и я боюсь echo $? дает обратное значение того, относительно чего просят. –   05.06.2013, 15:09
  • 2
    @htor, они (за исключением -c) стандартные опции в противоположность BSD-стилю aux ps args, которого нужно избежать при поиске мобильности. –  Stéphane Chazelas 05.06.2013, 16:13

Существует несколько способов проверить, работает ли процесс, имеющий конкретное имя в настоящее время. Нужно использовать pgrep и другой должен использовать ps:

pgrep "chromium" >/dev/null 2>&1 && echo 1 || echo 0
ps aux | grep "[c]hromium" >/dev/null 2>&1 && echo 1 || echo 0
grep "[c]hromium" <(ps aux) >/dev/null 2>&1 && echo 1 || echo 0

pgrep команда ищет процессы на основе их имени и отображает PID любого процесса, который соответствует его аргументу. Здесь возвращаемое значение pgrep используется вместо его вывода (следовательно перенаправление к /dev/null ) таким образом, мы знаем если что-то подобранное или нет. grep команда также отобразит соответствия к stdout таким образом, это должно быть перенаправлено также.

1
27.01.2020, 23:17
  • 1
    спасибо за Ваш быстрый ответ. Что-то как if pgrep chromium &> /dev/null; then echo 1; else echo 0; fi делает то, что я спросил..., но не существую что-то более эффективное или простое (я предпочитаю всего одну команду)? –  Radu Rădeanu 05.06.2013, 14:30
  • 2
    Это хорошо: pgrep chromium >/dev/null 2>&1 && echo 1 || echo 0.Спасибо! –  Radu Rădeanu 05.06.2013, 14:40
  • 3
    Обратите внимание, что они проверяют на процессы любым пользователем, имя процесса которого (первые 16 символов базового имени первого аргумента последнего execve () системный вызов те процессы сделали на Linux, хотя процессы могут также изменить его) содержит chromium. Нет никакой гарантии, что те процессы на самом деле подключены к Вашему X-серверу. –  Stéphane Chazelas 05.06.2013, 15:36
  • 4
    мой комментарий выше относился к pgrep решение. Для ps один, Вы ищете chromium любой, где в аргументах команды и имени пользователя, которое еще менее надежно. Вы забыли заключать в кавычки [c] что означает, что результат будет зависеть на том, существует ли названный файл chromium в текущем каталоге. –  Stéphane Chazelas 05.06.2013, 16:16

Теги

Похожие вопросы