bash, получение $DISPLAY пользователя системными скриптами

В общем сабж. Температурю, моск плохо работает, гугл плохо ищет.

Итак, имеем нужду, допустим, acpi скриптом отработать кнопочку выключения. Тупо при её нажатии запустить типо oblogout для пользователя.
Казалось-бы проблем нет. Пишем в скрипт что-то типа
    export DISPLAY=":0.0"
    export XAUTHORITY=/home/USERNAME/.Xauthority
   su USERNAME -c "oblogout"
вуаля, USERNAME при нажатии кнопочки, получает oblogout. Но, пользователей, вдруг, стало двое. Второму есс-но облом :)

Вроде-бы решение есть в вики
getuser ()
    {
     export DISPLAY=`echo $DISPLAY | cut -c -2`
     user=`who | grep " $DISPLAY" | awk '{print $1}' | tail -n1`
     export XAUTHORITY=/home/$user/.Xauthority
     eval $1=$user
    }

Бред полнейший -
1: Скрипты работают с правами демона, в данном случае рутовыми, и с его - же переменными окружениями - откуда аффтар отсосал $DISPLAY в окружении демона только ему известно.
2: who в таком контексте сработает только если у юзера открыты терминалы (xtrm, vte & etc.)

Аффтар школьник, и бредил прямо в вики. Ну и хрен с ним.
Я попрошу постить сюда известные Вам способы получения переменных окружений залогиненого пользователя иксов. Может у кого уже есть красивое решение. Мозг, при температуре, только вело-костыльный бред выдает…
В принципе, есть способ получить все переменные окружения для любого процесса – см. /proc/$PID/environ
Есть неудобство – в этом псевдофайле строки разделены не \n , а \0

Но думаю, в случае с $DISPLAY можно поступить даже проще – она есть в командной строке запущенных экземплляров X

Проблема, собственно, в другом – если запущено несколько сеансов X, я не знаю, как выяснить, какой из них сейчас на экране.

Думаю, всё это имеет смысл решать как-то иначе…
Natrio
……………………
Но думаю, в случае с $DISPLAY можно поступить даже проще – она есть в командной строке запущенных экземплляров X
………..

[w00zy@smoke ~]$ ps -C X -f --no-header
root       671   663  2 12:46 tty7     00:08:41 /usr/bin/X -nolisten tcp vt07 -dpi 100 -auth /var/run/slim.auth
Не светится зараза.
А, вот, через proc достать… Все костыльно, конечно. Я думал, может есть какое простое и элегантное решение, а главное переносимое, которого я не знаю.
Там-же, в вики, есть еще костыль
DBUS=$(ps aux | grep 'dbus-launch' | grep -v root)
if [[ ! -z $DBUS ]];then
	USER=$(echo $DBUS | awk '{print $1}')
	USERHOME=$(getent passwd $USER | cut -d: -f6)
	export XAUTHORITY="$USERHOME/.Xauthority"
	for x in /tmp/.X11-unix/*; do
		DISPLAYNUM=$(echo $x | sed s#/tmp/.X11-unix/X##)
		if [[ -f "$XAUTHORITY" ]]; then
			export DISPLAY=":$DISPLAYNUM"
		fi
	done
else
	USER=w00zy
	USERHOME=/home/$USER
	export XAUTHORITY="$USERHOME/.Xauthority"
	export DISPLAY=":0"
fi
ну у кого сейчас dbus не запущен :) находчиво, но как-то неэлегантно.
UPDATE.

w00zy
А, вот, через proc достать… Все костыльно, конечно. Я думал, может есть какое простое и элегантное решение, а главное переносимое, которого я не знаю.

Температура думать не дает. Через /proc и правда интересно. Можно сразу все, и наличие иксов проверить, и … Точно копать сюда.

[w00zy@smoke .X11-unix]$ ps -C X -f --no-header
root       671   663  2 12:46 tty7     00:09:26 /usr/bin/X -nolisten tcp vt07 -dpi 100 -auth /var/run/slim.auth
[w00zy@smoke .X11-unix]$ sudo cat /proc/671/environ | tr "\0" "\n"
CONSOLE=/dev/console
SHELL=/bin/sh
TERM=linux
INIT_VERSION=sysvinit-2.88
PATH=/sbin:/usr/sbin:/bin:/usr/bin
RUNLEVEL=5
PWD=/
PREVLEVEL=N
SHLVL=0
DISPLAY=:0.0
XAUTHORITY=/var/run/slim.auth

А уж openbox вообще всю подноготную выдает :)
 
Зарегистрироваться или войдите чтобы оставить сообщение.