On Tue, Sep 15, 2015 at 07:22:19PM +0300, Andrey Tataranovich wrote: > Доброго времени суток, > > Есть скрипт для ноутбука [1], запускающийся в сессии пользователя > через /etc/xdg/autostart (переключает lcd panel/external monitor в > зависимости от состояния крышки и наличия внешнего монитора + > по-мелочи). Скрипт запускает x11 утилиты, но зависит только от > подключения к системной шине dbus. > > В скрипте есть механизм для перезапуска при повторном логине (для > обновления значений DISPLAY и XAUTHORITY), но хочется реализовать его > завершение при завершении пользовательской сессии. > > Как это правильно делается в скриптах? Подозреваю, что можно запустить > еще один dbus-monitor для session bus, но возможно есть другой способ?
Не знаю, подойдёт ли в твоём случае, но в dwm (и в некоторых других минималистичных WM) для запуска одноразовых приблуд, и тех, что должны работать постоянно (например, индикации времени), используется .xsession. Насколько я ничего не понимаю, он убивается при завершении иксов. Ну и в нём картина примерно такая: ------------------------------------8<------------------------------------ #!/bin/sh # Одноразовые ерунды xrandr --output default --mode 880x660 xautolock -corners 00+0 -locker /usr/bin/xtrlock & # Настройка клавиатуры xmodmap ~/.config/xmodmap # Общие настройки . ~/.config/profile # Регулярные фигни while STORAGE="" ls /dev/disk/by-id/|grep "usb.*part.$" >/dev/null && for DEV in $(ls /dev/disk/by-id/usb*part?|xargs -L1 readlink -f|sed 's%/dev/%%'); do MP=$(mount|grep $DEV|awk '{print $3}') if [ "$MP" ]; then STORAGE=$STORAGE" ["$MP"]" else STORAGE=$STORAGE" ["$DEV"]" fi done # Загрузка системы в % UPTIME=$(uptime | sed 's/.*://; s/[,.]//g') # Дата и время DATE=$(date +'%a %d.%m.%Y %H:%M:%S') # Раскладка KEYMAP=$(xset q| sed -n '/LED mask:/ {s/.*[0-9]\{4\}\([0-9]\)[0-9]\{3\}/\1/; s/1/Ru/; s/0/En/; p}') xsetroot -name "$KEYMAP$STORAGE $UPTIME $DATE"; do sleep 1 done & # Собственно запуск WM exec /usr/local/bin/dwm ------------------------------------>8------------------------------------ Цикл while в середине остаётся висеть в фоне, пока соответствующий X работает. При выходе умирает. Опять же, не могу сказать про DE, в которых, возможно (не уверен), пользовательская сессия может переключаться без завершения иксов.