Короткий: нет решения (ТМ) для того, что Вы хотите.
Однако с достаточным знанием о Вашей установке может быть возможно разработать решение, которое работает на Вас. У меня была та же проблема однажды.
Причина, почему это столь трудно, состоит в том, что 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
С этой таблицей я выполняю голосование простым большинством, которое приводит к отображению:
Это решение большинством голосов не обязательно приводит к корректным отображениям однако для всех моих намерений и целей, это достаточно.
Это - все, в чем Вы нуждаетесь. Теперь Вы можете
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
.
Конечно, существуют (так) много других способов заменить мое решение большинством голосов. Который является самым подходящим для Вас, необходимо узнать себя...
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
опция.
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
не определяется.
echo $?
дает обратное значение того, относительно чего просят.
–
05.06.2013, 15:09
-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
таким образом, это должно быть перенаправлено также.
if pgrep chromium &> /dev/null; then echo 1; else echo 0; fi
делает то, что я спросил..., но не существую что-то более эффективное или простое (я предпочитаю всего одну команду)?
– Radu Rădeanu
05.06.2013, 14:30
pgrep chromium >/dev/null 2>&1 && echo 1 || echo 0
.Спасибо!
– Radu Rădeanu
05.06.2013, 14:40
chromium
. Нет никакой гарантии, что те процессы на самом деле подключены к Вашему X-серверу.
– Stéphane Chazelas
05.06.2013, 15:36
pgrep
решение. Для ps
один, Вы ищете chromium
любой, где в аргументах команды и имени пользователя, которое еще менее надежно. Вы забыли заключать в кавычки [c]
что означает, что результат будет зависеть на том, существует ли названный файл chromium
в текущем каталоге.
– Stéphane Chazelas
05.06.2013, 16:16