[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Завершение shell скрипта при окончании сессии пользователя (logout)



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, в которых, возможно (не уверен),
пользовательская сессия может переключаться без завершения иксов.


Reply to: