Решал тут локальную задачку - выводить уведомления от висящего в фоне процесса на дисплей всем висящим в данный момент на машине пользователям через libnotify (если кого частности интересуют - уведомления от NUTа о работе на UPS, чтобы даже при работе по удаленке, когда не видно, что творится с лампочками, отключение системы из-за пропадания питания не было бы слишком внезапным). Оказалось не так-то просто, как на первый взгляд кажется - мало того, что пользователь может послать сообщение через dBus только самому себе, там надо еще знать, в какой именно экземпляр этого самого dBus кукарекнуть, и на какой дисплей это сообщение выводить.
Вот ниже то, что получилось. Звать через sudo (иначе пощупать окружение чужих процессов не получится). Сделано под ubuntu 11.04 c GDM, под другие системы, соответственно, надо будет допилить в части разбора параметров менеджера окон.
Заранее извиняюсь за кривизну кода, делалось по принципу - "чтобы побыстрее заработало".
Вот ниже то, что получилось. Звать через sudo (иначе пощупать окружение чужих процессов не получится). Сделано под ubuntu 11.04 c GDM, под другие системы, соответственно, надо будет допилить в части разбора параметров менеджера окон.
Заранее извиняюсь за кривизну кода, делалось по принципу - "чтобы побыстрее заработало".
notify icon-name title message-text...
#!/bin/bash
icon=$1
header=$2
shift
shift
message=$*
# просматриваем все сессии gnome
pids=`pgrep dbus-launch`
for pid in $pids; do
# вынимаем из окружения процесса шину, пользователя и дисплей
DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
user=`grep -z "USER=" /proc/$pid/environ | sed -e 's/USER=//'`
DISPLAY=`grep -z "DISPLAY=" /proc/$pid/environ | sed -e 's/DISPLAY=//'`
export DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS
export DISPLAY=$DISPLAY
export XAUTHORITY=/home/$user/.Xauthority
set
# посылаем сообщения от нужного пользователя ему же
sudo -u $user notify-send -i $icon $header "$message"
done
|