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

Ответить