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. Но от терминала отцепляет.
Reply to: