снежный человек

rvb_glas

Делай что должно, и будь что будет


Previous Entry Поделиться Next Entry
notify-send из планировщика
снежный человек
rvb_glas
Решал тут локальную задачку - выводить уведомления от висящего в фоне процесса на дисплей всем висящим в данный момент на машине пользователям через libnotify (если кого частности интересуют - уведомления от NUTа о работе на UPS, чтобы даже при работе по удаленке, когда не видно, что творится с лампочками, отключение системы из-за пропадания питания не было бы слишком внезапным). Оказалось не так-то просто, как на первый взгляд кажется - мало того, что пользователь может послать сообщение через dBus только самому себе, там надо еще знать, в какой именно экземпляр этого самого dBus кукарекнуть, и на какой дисплей это сообщение выводить.

Вот ниже то, что получилось. Звать через sudo (иначе пощупать окружение чужих процессов не получится). Сделано под ubuntu 11.04 c GDM, под другие системы, соответственно, надо будет допилить в части разбора параметров менеджера окон.

Заранее извиняюсь за кривизну кода, делалось по принципу - "чтобы побыстрее заработало".
  notify icon-name title message-text...


P.S. Исправленая версия пользуется тем фактом, что dbus-launch всегда есть, и всегда один на сессию. Наутилусов же может быть пара - от юзера и от рута.
#!/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

?

Log in

No account? Create an account