Здравствуйте, Hank, Вы писали:
H>Пара вопросов, связанных с управлением процессами в терминальных сессиях. H>Имеет смысл сразу сделать оговорку — разработкой системных приложений под линкус занят относительно недавно и нет хорошего уровня понимания работы системы. Только общие принципы, разработка прикладного софта. Поэтому иногда буду сбиваться в терминологию Windows и примеры оттуда же.
Было бы понятнее, если бы вместо употребления рандомных терминов, смысла которых вы не понимаете, описали вашу задачу нормальным языком.
H>1. Как отслеживать logon/logoff, блокировку сессии и т.д. из демона?
H>Как это реализовать в linux?
D-BUS, если мы говорим про GUI сессии. Терминальные сессии это совсем про другое.
H>2. Каким образом запустить процесс в нужной/указанной терминальной сессии? Допустим, нам необходимо после логона пользователя запустить из Демона в его сессии "агент". H>В Windows это делается через связку WTSQueryUserToken — CreateProcessAsUser
H>Какой подход нужно использовать в linux?
Запускаешь под рутом демона, который слушает D-BUS и при логине пользователя запускает для него процесс, а при логауте этот процесс прибивает.
H>По обоим вопросам перелопатил очень много ресурсов, однако, безрезультатно, хотя, есть подозрение, что вопросы простые.
В линуксе принято делать просто. Процесс это процесс, демон это демон. Если тебе нужно запустить процесс, ты его запускаешь. Если нужно остановить, останавливаешь.
Пара вопросов, связанных с управлением процессами в терминальных сессиях.
Имеет смысл сразу сделать оговорку — разработкой системных приложений под линкус занят относительно недавно и нет хорошего уровня понимания работы системы. Только общие принципы, разработка прикладного софта. Поэтому иногда буду сбиваться в терминологию Windows и примеры оттуда же.
Имеется некая служба (демон systemd), которая слушает сокет и принимает определенные команды по сети. Задача — в каждой терминальной сессии (как это правильно называется в Линкус, так до конца и не понял) запускать некий "агент", от имени пользователя этой сессии. Данный Агент отображает GUI и коммуницирует через IPC с демоном. Отсюда возникает несколько вопросов:
2. Каким образом запустить процесс в нужной/указанной терминальной сессии? Допустим, нам необходимо после логона пользователя запустить из Демона в его сессии "агент".
В Windows это делается через связку WTSQueryUserToken — CreateProcessAsUser
Какой подход нужно использовать в linux?
По обоим вопросам перелопатил очень много ресурсов, однако, безрезультатно, хотя, есть подозрение, что вопросы простые.
Также важная оговорка, — речь идет исключительно про GUI варианты оболочек.
M>Запускаешь под рутом демона, который слушает D-BUS и при логине пользователя запускает для него процесс, а при логауте этот процесс прибивает.
Спасибо за наводку, на сколько я понял, речь идет про https://www.freedesktop.org/wiki/Software/systemd/logind/ думаю с этим проблем быть не должно, как раз в Qt есть библиотека для работы с d-bus.
Однако, возникает такой вопрос — каким образом запустить процесс именно в нужной GUI-сессии?
и при логине пользователя запускает для него процесс
Да и есть масса софта, который работает по похожей схеме. Да, некоторый использует возможности gnome (~/.config/autostart/) для автозапуска программ, но далеко не весь.
Вот в этом и вопрос. Каким образом в GUI сессии, при логоне пользователя запускать процесс? Причем, не важно из демона ли или через какой-то системный механизм.
Здравствуйте, Hank, Вы писали:
H>Вот в этом и вопрос. Каким образом в GUI сессии, при логоне пользователя запускать процесс? Причем, не важно из демона ли или через какой-то системный механизм.
Почитайте что-нибудь типа "Linux system programming", "Unix and Linux System Administration Handbook", хотя бы разделы про инициализацию и про процессы.
H>Да и есть масса софта, который работает по похожей схеме. Да, некоторый использует возможности gnome (~/.config/autostart/) для автозапуска программ, но далеко не весь.
Если вам надо запускать GUI приложение при старте сессии, посмотрите в сторону systemd user services
Здравствуйте, Miroff, Вы писали:
M>Запускаешь под рутом демона, который слушает D-BUS и при логине пользователя запускает для него процесс, а при логауте этот процесс прибивает.
Я бы, скорее, в автостарт прописался. Во-первых, это позволяет не иметь дело с d-bus, что само по себе приятно. Во-вторых, не возникает сложностей, как присоединиться именно к тому x-серверу, на котором работает пользователь.
Здравствуйте, Miroff, Вы писали:
H>>Однако, возникает такой вопрос — каким образом запустить процесс именно в нужной GUI-сессии?
M>Никак. Процессы в Линуксе не привязаны к сессиям пользователя. Более того сама сессия это тоже процесс.
В переводе на линуксный, это как найти релевантный x-сервер и credentials для присоединения к нему. Может на этот вопрос и есть ответ, но проще прописаться в автостарт
Есть понятие systemd user service. Он запускается при первом входе юзера в систему (не важно — через ядерную консоль, ssh или GUI) и завершается после последнего выхода юзера из системы. Это имеет смысл, если не нужен доступ к графике. Также будет один сервис на все сессии пользователя, в общем случае их может быть много, и у пользователя графика может быть не запущена.
Есть понятие автостарта. Это не системное понятие, просто когда графическая оболочка стартует, она запускает какие-то программы. Там уже будет доступна графика и работает оно, соответственно, именно для графического сеанса и будет запускаться каждый раз при запуске нового сеанса. Судя по описанию нужно именно оно.
Здравствуйте, vsb, Вы писали:
vsb>Есть понятие systemd user service. Он запускается при первом входе юзера в систему (не важно — через ядерную консоль, ssh или GUI) и завершается после последнего выхода юзера из системы. Это имеет смысл, если не нужен доступ к графике. Также будет один сервис на все сессии пользователя, в общем случае их может быть много, и у пользователя графика может быть не запущена.
vsb>Есть понятие автостарта. Это не системное понятие, просто когда графическая оболочка стартует, она запускает какие-то программы. Там уже будет доступна графика и работает оно, соответственно, именно для графического сеанса и будет запускаться каждый раз при запуске нового сеанса. Судя по описанию нужно именно оно.
Да, совершенно верно, интересуют исключительно графическая оболочка. Вопрос, каким образом по феншую сделать автостарт, т.е. наиболее правильно?
В общем случае, нужно иметь Агента в каждой графической сессии и переключаться через IPC из демона к текущей т.н. консольной (в терминологии винды) сессии. Т.е. может быть одновременно залогинено несколько пользователей, но через физическую консоль доступен только один.
Тем не менее, каким-то образом можно из демона запускать процесс в нужной сессии, я такой софт видел.
seteuid?
H>Имеется некая служба (демон systemd), которая слушает сокет и принимает определенные команды по сети. Задача — в каждой терминальной сессии (как это правильно называется в Линкус, так до конца и не понял) запускать некий "агент", от имени пользователя этой сессии. Данный Агент отображает GUI и коммуницирует через IPC с демоном. Отсюда возникает несколько вопросов:
H>1. Как отслеживать logon/logoff, блокировку сессии и т.д. из демона? H>2. Каким образом запустить процесс в нужной/указанной терминальной сессии? Допустим, нам необходимо после логона пользователя запустить из Демона в его сессии "агент". H>По обоим вопросам перелопатил очень много ресурсов, однако, безрезультатно, хотя, есть подозрение, что вопросы простые.
Ответ на оба вопроса очень простой — универсальным образом никак.
В разных дистрибутивах разные оболочки (DE), среды их запуска и по разному оформлен вход пользователя и его сессия. Универсального способа, даже только для GUI, просто нету.
Самый простой способ сделать желаемое не делать это вообще — как подсказали выше autostart (привязанный к настройкам DE конкретных дистрибутивов). Понятно, что ваше ПО это security & etc, для которого старт агента который может обойти пользователь не то, однако штатные средства безопасности части дистрибутивов и разнообразие окружений не дадут вам запускать что-то постраннее универсальным способом.
PS. Насчёт DBus & logon/logoff/lock — относительно универсально, но всё же не во всех дистрибутивах, при встрече с экзотическими менеджерами сессии с DBus тоже начинаются сложности.