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

2015-10-11 Пенетрантность dimas
цикл while синтаксически ущербный какой-то, см. help while. для бесконечного
цикла правильно будет
while true; do
bla-bla-bla
done


2015-283 12:20 Vladimir Zhbanov  wrote:
> Цикл while в середине остаётся висеть в фоне, пока соответствующий X
> работает. При выходе умирает.



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

2015-10-11 Пенетрантность Vladimir Zhbanov
On Sun, Oct 11, 2015 at 05:57:52PM +0300, dimas wrote:
> цикл while синтаксически ущербный какой-то, см. help while. для бесконечного
> цикла правильно будет
> while true; do
>   bla-bla-bla
> done
> 
man sh:
  The syntax of the while command is
while list
do   list
done

Цикл там ни разу не бесконечный, а до тех пор пока xsetroot работает.

А вот топ-квотинг -- штука ущербная (на мой взгляд).

> 
> 2015-283 12:20 Vladimir Zhbanov  wrote:
> > Цикл while в середине остаётся висеть в фоне, пока соответствующий X
> > работает. При выходе умирает.
> 



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

2015-10-11 Пенетрантность dimas
в xfce+lightdm иксы запускает от рута lightdm, в других должно быть аналогично
(если не запущать DE через startx или тому подобное от юзреа, без DM).
но при этом в хомяку создается .xsession-errors, в котором видим следующее:

Xsession: X session started for dimas at Вс окт 11 17:12:31 MSK 2015
localuser:dimas being added to access control list
/usr/bin/x-session-manager: X server already running on display :0

т.е. к запущенным из-под рута иксам цепляется пользовательская сессия.
возможно, это дело будет читать .xsession/.xinitrc, но опять же все зависит от
реализации в конкретном de/wm


2015-283 12:20 Vladimir Zhbanov  wrote:
> Опять же, не могу сказать про DE, в которых, возможно (не уверен),
> пользовательская сессия может переключаться без завершения иксов.



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

2015-10-10 Пенетрантность Andrey Tataranovich
On Fri, 09 Oct 2015 22:14:36 +0600
cat3  wrote:

> PAM session pam_exec.so уже предлагали? Это может помочь:
> 
> http://linux.die.net/man/8/pam_exec
> 
> https://www.linuxquestions.org/questions/linux-software-2/clear-screen-
> on-logout-using-pam-888174/
> 
> С помощью строки
> "session  optionalpam_exec.so /path/to/script.sh"
> в соответствующем файле в pam.d/ можно заставить PAM выполнять
> script.sh при каждом начале/завершении сессии пользователя. 

Это вмешательство в работу системы. Я ищу способ завершить скрипт без
каких либо изменений в системе.

-- 
WBR, Andrey Tataranovich



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

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



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

2015-10-09 Пенетрантность Yuriy M. Kaminskiy
Andrey Tataranovich  writes:

> On Fri, 9 Oct 2015 15:08:15 +0300
> Andrey Tataranovich  wrote:
>
>> Возможно тут мне поможет использование
>> 
>> xprop -id $(xwininfo -root -int | awk '/^xwininfo:/ {print $4}') -spy
>
> Даже проще
>
> xprop -root -spy

FYI: в xprop -spy есть серьёзный memory leak, его нельзя оставлять работать
надолго.
См.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765828

Патчи для исправления пару недель назад были приняты в upstream/master:
http://permalink.gmane.org/gmane.comp.freedesktop.xorg.devel/46851
http://permalink.gmane.org/gmane.comp.freedesktop.xorg.devel/46895

git://anongit.freedesktop.org/git/xorg/app/xprop
b0ae4b9..fa732ad



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

2015-10-09 Пенетрантность Artem Chuprina
Руслан Коротаев -> debian-russian@lists.debian.org  @ Fri, 9 Oct 2015 20:02:25 
+0500:

 >> Решение в виде session-cleanup-script - это костыль. Оно не
 >> универсально и зависит от конкретного DM. Я ищу правильное решение,
 >> чтобы приложение могло узнать, что сессия завершается и совершить
 >> нужные действия.

 РК> Как вариант, можно попробовать ~/.bash_logout, если используете bash.
 РК> Предполагается что вы выключаете или перезагружаете комп, заодно
 РК> подчищаете логи, делаете бекап и так далее. Однако приложение не узнает
 РК> что сессия завершается, просто выполнит скрипт, но зато не зависимо от
 РК> конкретного DE/WM. 

Насколько я понимаю, .bash_logout не запускается, если то была не
интерактивная терминальная сессия.  Иксовая сессия не является
интерактивной терминальной.

 >> Похоже DE в частности XFCE4 не следит за всеми процессами, которые были
 >> запущены самой DE. Хотя с другой стороны возможно это и правильно - я
 >> ведь могу запустить несколько процессов, которые вполне могут жить и
 >> после завершения сессии.
 >> 
 >> У меня пробел в знании как вообще работает завершение сессии в DE. Ведь
 >> при выходе из системы приложения каким-то образом узнают, что сессия
 >> завершается. Например writer просит сохранить документ при выходе, но
 >> если ему отправить сигнал TERM, то ничего подобного не происходит.
 >> 
 >> Возможно DE закрывает все окна в текущей сессии и таким образом
 >> достигается gracefull exit.

 РК> Видимо это особенность конкретного DE/WM, у меня xmonad, когда я из него
 РК> выхожу он меня вообще ни о чем не предупреждает, вываливается в консоль
 РК> и всё. Writer потом пробует восстановить документ, а вот то что было
 РК> запущенно в терминале ведет себя по разному, некоторые приложения
 РК> нормально завершают работу, некоторые демонизируются, то есть это
 РК> зависит от самого приложения, от того как там реализована обработка
 РК> сигналов. 

Это, в общем, одна из разниц между DE и WM.  DE подразумевает интеграцию
в том числе и на уровне сеанса работы в среде, информирует свои
компоненты (и вообще всех, кто понимает) о _намерении_ пользователя
завершить сеанс и пытается дождаться ответов.  

WM ведет себя попроще.  Судя по "демонизируются", шлет SIGHUP.  Я, если
честно, не проверял, как ведет себя xmonad - я обычно закрываю все
программы вручную, прежде чем выйти.  Я, впрочем, оттуда выхожу только
когда собираюсь перезагрузить машинку, раз в несколько месяцев.



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

2015-10-09 Пенетрантность cat3
PAM session pam_exec.so уже предлагали? Это может помочь:

http://linux.die.net/man/8/pam_exec

https://www.linuxquestions.org/questions/linux-software-2/clear-screen-
on-logout-using-pam-888174/

С помощью строки
"sessionoptionalpam_exec.so /path/to/script.sh"
в соответствующем файле в pam.d/ можно заставить PAM выполнять
script.sh при каждом начале/завершении сессии пользователя. 


P.S. первый раз пишу в @lists, прошу простить, если что не так. 



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

2015-10-09 Пенетрантность Andrey Tataranovich
On Fri, 9 Oct 2015 15:08:15 +0300
Andrey Tataranovich  wrote:

> Возможно тут мне поможет использование
> 
> xprop -id $(xwininfo -root -int | awk '/^xwininfo:/ {print $4}') -spy

Даже проще

xprop -root -spy

-- 
WBR, Andrey Tataranovich



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

2015-10-09 Пенетрантность Andrey Tataranovich
On Thu, 08 Oct 2015 22:29:39 +0300
Илья  wrote:

> Это конечно не правильно, но можно отслеживать изменения pid в файле 
> /tmp/.X0-lock.
> 
> $ps `cat /tmp/.X0-lock`
>PID TTY  STAT   TIME COMMAND
> 21334 tty7 Ss+0:16 /usr/bin/X :0
> -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitc

Интересный вариант, но такое решение не подойдет, если приложение
запущено через сеть, например через "ssh -X"

-- 
WBR, Andrey Tataranovich



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

2015-10-09 Пенетрантность Artem Chuprina
Andrey Tataranovich -> debian-russian@lists.debian.org  @ Fri, 9 Oct 2015 
13:35:05 +0300:

 >> по идее, если его запускает DE, запускаемый из-под пользователя, то
 >> при выходе из сессии должен глушиться DE и все процессы-потомки, что
 >> он назапускал. можно попробовать реализовать желаемое средствами DM.
 >> например, в lightdm есть вот такая штука в конфиге:
 >> # session-cleanup-script = Script to run when quitting a user session
 >> (runs as root) как в других - не знаю.
 >> либо копать в сторону приблуды, управляющей сессиями в DE (типа
 >> xfce4-session в xfce), возможно там будут какие-то механизмы
 >> выполнения команд при разлогине

 AT> Решение в виде session-cleanup-script - это костыль. Оно не
 AT> универсально и зависит от конкретного DM. Я ищу правильное решение,
 AT> чтобы приложение могло узнать, что сессия завершается и совершить
 AT> нужные действия.

 AT> Похоже DE в частности XFCE4 не следит за всеми процессами, которые были
 AT> запущены самой DE. Хотя с другой стороны возможно это и правильно - я
 AT> ведь могу запустить несколько процессов, которые вполне могут жить и
 AT> после завершения сессии.

 AT> У меня пробел в знании как вообще работает завершение сессии в DE. Ведь
 AT> при выходе из системы приложения каким-то образом узнают, что сессия
 AT> завершается. Например writer просит сохранить документ при выходе, но
 AT> если ему отправить сигнал TERM, то ничего подобного не происходит.

 AT> Возможно DE закрывает все окна в текущей сессии и таким образом
 AT> достигается gracefull exit.

Ну, там два хода, скорее всего.  Сначала всем окнам посылается close
(иксовое сообщение, не сигнал процессу).  По нему-то writer и предлагает
сохранить документ.

А потом тупо делается exit, а за убийство или неубийство процессов
отвечает уже ядро, на основании того, работали ли они в той же сессии
(уже в смысле процессов, а не в смысле иксов) или при запуске сделали
себе setsid.  И шлется им, кажется, не SIGTERM, а SIGHUP.  Кстати,
проверь - если writer'у послать SIGHUP, он предложит сохранить или нет?

Надо сказать, что в юниксах традиционно за уход процесса из сессии
отвечает сам процесс.  Так делают штатные демоны.  Но вот zsh, например,
имеет ручку "демонизировать запущенное", когда перед exec делается не
только fork, но и setsid.  Но, кстати, кажется, не закрывает
stdout/stderr.

nohup, кстати, сколь я помню, не делает setsid, а только игнорирует
SIGHUP.  Но от терминала отцепляет.



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

2015-10-09 Пенетрантность Илья
Ну если переменная $DBUS_SESSION_BUS_ADDRESS видна то возможно ее 
анализировать?


On 10/09/2015 01:38 PM, Andrey Tataranovich wrote:

On Thu, 08 Oct 2015 22:29:39 +0300
Илья  wrote:


Это конечно не правильно, но можно отслеживать изменения pid в файле
/tmp/.X0-lock.

$ps `cat /tmp/.X0-lock`
PID TTY  STAT   TIME COMMAND
21334 tty7 Ss+0:16 /usr/bin/X :0
-auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitc

Интересный вариант, но такое решение не подойдет, если приложение
запущено через сеть, например через "ssh -X"





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

2015-10-09 Пенетрантность Andrey Tataranovich
On Fri, 09 Oct 2015 14:46:14 +0300
Artem Chuprina  wrote:

> Ну, там два хода, скорее всего.  Сначала всем окнам посылается close
> (иксовое сообщение, не сигнал процессу).  По нему-то writer и
> предлагает сохранить документ.

Возможно тут мне поможет использование

xprop -id $(xwininfo -root -int | awk '/^xwininfo:/ {print $4}') -spy

если процесс завершился, то нужно прибивать скрипт.

> А потом тупо делается exit, а за убийство или неубийство процессов
> отвечает уже ядро, на основании того, работали ли они в той же сессии
> (уже в смысле процессов, а не в смысле иксов) или при запуске сделали
> себе setsid.  И шлется им, кажется, не SIGTERM, а SIGHUP.  Кстати,
> проверь - если writer'у послать SIGHUP, он предложит сохранить или
> нет?

writer никак не реагирует на sighup

-- 
WBR, Andrey Tataranovich



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

2015-10-09 Пенетрантность Andrey Tataranovich
On Thu, 8 Oct 2015 15:08:01 +0300
dimas  wrote:

> по идее, если его запускает DE, запускаемый из-под пользователя, то
> при выходе из сессии должен глушиться DE и все процессы-потомки, что
> он назапускал. можно попробовать реализовать желаемое средствами DM.
> например, в lightdm есть вот такая штука в конфиге:
> # session-cleanup-script = Script to run when quitting a user session
> (runs as root) как в других - не знаю.
> либо копать в сторону приблуды, управляющей сессиями в DE (типа
> xfce4-session в xfce), возможно там будут какие-то механизмы
> выполнения команд при разлогине

Решение в виде session-cleanup-script - это костыль. Оно не
универсально и зависит от конкретного DM. Я ищу правильное решение,
чтобы приложение могло узнать, что сессия завершается и совершить
нужные действия.

Похоже DE в частности XFCE4 не следит за всеми процессами, которые были
запущены самой DE. Хотя с другой стороны возможно это и правильно - я
ведь могу запустить несколько процессов, которые вполне могут жить и
после завершения сессии.

У меня пробел в знании как вообще работает завершение сессии в DE. Ведь
при выходе из системы приложения каким-то образом узнают, что сессия
завершается. Например writer просит сохранить документ при выходе, но
если ему отправить сигнал TERM, то ничего подобного не происходит.

Возможно DE закрывает все окна в текущей сессии и таким образом
достигается gracefull exit.

-- 
WBR, Andrey Tataranovich



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

2015-10-09 Пенетрантность Руслан Коротаев
В сообщении от [Пт 2015-10-09 13:35 +0300]
Andrey Tataranovich  пишет:

> Решение в виде session-cleanup-script - это костыль. Оно не
> универсально и зависит от конкретного DM. Я ищу правильное решение,
> чтобы приложение могло узнать, что сессия завершается и совершить
> нужные действия.

Как вариант, можно попробовать ~/.bash_logout, если используете bash.
Предполагается что вы выключаете или перезагружаете комп, заодно
подчищаете логи, делаете бекап и так далее. Однако приложение не узнает
что сессия завершается, просто выполнит скрипт, но зато не зависимо от
конкретного DE/WM. 
 
> Похоже DE в частности XFCE4 не следит за всеми процессами, которые были
> запущены самой DE. Хотя с другой стороны возможно это и правильно - я
> ведь могу запустить несколько процессов, которые вполне могут жить и
> после завершения сессии.
> 
> У меня пробел в знании как вообще работает завершение сессии в DE. Ведь
> при выходе из системы приложения каким-то образом узнают, что сессия
> завершается. Например writer просит сохранить документ при выходе, но
> если ему отправить сигнал TERM, то ничего подобного не происходит.
> 
> Возможно DE закрывает все окна в текущей сессии и таким образом
> достигается gracefull exit.

Видимо это особенность конкретного DE/WM, у меня xmonad, когда я из него
выхожу он меня вообще ни о чем не предупреждает, вываливается в консоль
и всё. Writer потом пробует восстановить документ, а вот то что было
запущенно в терминале ведет себя по разному, некоторые приложения
нормально завершают работу, некоторые демонизируются, то есть это
зависит от самого приложения, от того как там реализована обработка
сигналов. 

-- 
http://google.com/+РусланКоротаев



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

2015-10-08 Пенетрантность dimas
по идее, если его запускает DE, запускаемый из-под пользователя, то при выходе
из сессии должен глушиться DE и все процессы-потомки, что он назапускал.
можно попробовать реализовать желаемое средствами DM. например, в lightdm есть
вот такая штука в конфиге:
# session-cleanup-script = Script to run when quitting a user session (runs as 
root)
как в других - не знаю.
либо копать в сторону приблуды, управляющей сессиями в DE (типа xfce4-session в
xfce), возможно там будут какие-то механизмы выполнения команд при разлогине

2015-258 19:22 Andrey Tataranovich  wrote:
> Доброго времени суток,
> 
> Есть скрипт для ноутбука [1], запускающийся в сессии пользователя
> через /etc/xdg/autostart (переключает lcd panel/external monitor в
> зависимости от состояния крышки и наличия внешнего монитора +
> по-мелочи). Скрипт запускает x11 утилиты, но зависит только от
> подключения к системной шине dbus.
> 
> В скрипте есть механизм для перезапуска при повторном логине (для
> обновления значений DISPLAY и XAUTHORITY), но хочется реализовать его
> завершение при завершении пользовательской сессии.
> 
> Как это правильно делается в скриптах? Подозреваю, что можно запустить
> еще один dbus-monitor для session bus, но возможно есть другой способ?
> 
> 1)
> https://raw.githubusercontent.com/tataranovich/laptop-utils/master/src/laptop-utils.sh
> 



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

2015-10-08 Пенетрантность Илья
Это конечно не правильно, но можно отслеживать изменения pid в файле 
/tmp/.X0-lock.


$ps `cat /tmp/.X0-lock`
  PID TTY  STAT   TIME COMMAND
21334 tty7 Ss+0:16 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 
-nolisten tcp vt7 -novtswitc


T

On 09/15/2015 07:22 PM, Andrey Tataranovich wrote:

В скрипте есть механизм для перезапуска при повторном логине (для
обновления значений DISPLAY и XAUTHORITY), но хочется реализовать его
завершение при завершении пользовательской сессии.

Как это правильно делается в скриптах? Подозреваю, что можно запустить
еще один dbus-monitor для session bus, но возможно есть другой способ?

1)
https://raw.githubusercontent.com/tataranovich/laptop-utils/master/src/laptop-utils.sh





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

2015-09-15 Пенетрантность Andrey Tataranovich
Доброго времени суток,

Есть скрипт для ноутбука [1], запускающийся в сессии пользователя
через /etc/xdg/autostart (переключает lcd panel/external monitor в
зависимости от состояния крышки и наличия внешнего монитора +
по-мелочи). Скрипт запускает x11 утилиты, но зависит только от
подключения к системной шине dbus.

В скрипте есть механизм для перезапуска при повторном логине (для
обновления значений DISPLAY и XAUTHORITY), но хочется реализовать его
завершение при завершении пользовательской сессии.

Как это правильно делается в скриптах? Подозреваю, что можно запустить
еще один dbus-monitor для session bus, но возможно есть другой способ?

1)
https://raw.githubusercontent.com/tataranovich/laptop-utils/master/src/laptop-utils.sh

-- 
WBR, Andrey Tataranovich