Re: Завершение shell скрипта при окончании сессии пользователя (logout)
цикл while синтаксически ущербный какой-то, см. help while. для бесконечного цикла правильно будет while true; do bla-bla-bla done 2015-283 12:20 Vladimir Zhbanovwrote: > Цикл while в середине остаётся висеть в фоне, пока соответствующий X > работает. При выходе умирает.
Re: Завершение shell скрипта при окончании сессии пользователя (logout)
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 Zhbanovwrote: > > Цикл while в середине остаётся висеть в фоне, пока соответствующий X > > работает. При выходе умирает. >
Re: Завершение shell скрипта при окончании сессии пользователя (logout)
в 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 Zhbanovwrote: > Опять же, не могу сказать про DE, в которых, возможно (не уверен), > пользовательская сессия может переключаться без завершения иксов.
Re: Завершение shell скрипта при окончании сессии пользователя (logout)
On Fri, 09 Oct 2015 22:14:36 +0600 cat3wrote: > 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)
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)
Andrey Tataranovichwrites: > 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)
Руслан Коротаев -> 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)
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)
On Fri, 9 Oct 2015 15:08:15 +0300 Andrey Tataranovichwrote: > Возможно тут мне поможет использование > > xprop -id $(xwininfo -root -int | awk '/^xwininfo:/ {print $4}') -spy Даже проще xprop -root -spy -- WBR, Andrey Tataranovich
Re: Завершение shell скрипта при окончании сессии пользователя (logout)
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)
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)
Ну если переменная $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)
On Fri, 09 Oct 2015 14:46:14 +0300 Artem Chuprinawrote: > Ну, там два хода, скорее всего. Сначала всем окнам посылается 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)
On Thu, 8 Oct 2015 15:08:01 +0300 dimaswrote: > по идее, если его запускает 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 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)
по идее, если его запускает 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 Tataranovichwrote: > Доброго времени суток, > > Есть скрипт для ноутбука [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)
Это конечно не правильно, но можно отслеживать изменения 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)
Доброго времени суток, Есть скрипт для ноутбука [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