На самом деле я сделал это с TrueOS (, ранее известной как PC -BSD ), чуть меньше года назад.
В vanilla TrueOS служба pcdm
запускает графический интерфейс пользователя.
rc
работает скрипт /usr/local/etc/rc.d/pcdm
, который -просуществовал недолго. PCDMd
порождает xinit
указание запустить программу с именем PCDM-session
. PCDM-session
— это программа для выбора рабочего стола и входа в систему, которая записывает одноразовый сценарий оболочки в /tmp
. Он порождает /usr/local/share/PCDM/pcdm-session
. Он также выделяет и делает осиротевшим dbus-daemon
, запущенный от имени суперпользователя, на стороне, если ему не передается информация о шине рабочего стола для связи. /usr/local/share/PCDM/pcdm-session
привязывается к sh /tmp/PCDM-session.blah
, написанному ранее сценарию. $HOME/.xprofile
, где все вещи, такие как gpg-agent
, разветвляются, и, наконец, запускает сеанс выбранного рабочего стола черезdbus-launch
(запуск как зарегистрированный -в user и запускает другой dbus-daemon
процесс ). Это приводит к довольно запутанному дереву процессов, как для всего, что разветвлено $HOME/.xprofile
(, которое запускает все из /usr/local/share/pcbsd/xstartup/
), так и для всего, запущенного в процессе сеанса рабочего стола, а затем потерянного через fork -и -выход. -родитель (вроде, увы,thunderbird
). Все брокеры D -Bus также не очень хороши; многие вещи заканчиваются процессом #1 в качестве идентификатора родительского процесса. Именование также не помогает сделать это простым. pcdm
вызывает PCDMd
вызывает PCDM-session
вызывает pcdm-session
вызывает PCDM-session.blah
.
(Я пытался донести до специалистов TrueOS, что это было излишне сложно , особенно совершенно ненужный скрытый дополнительный и неработающий диспетчер служб внутри PCDM-session
программы, который я не включил в приведенное выше описание.)
local-reaper
и userenv
из набора инструментов Nosh В наборе инструментов nosh есть небольшая цепочка -утилиты загрузки с именем local-reaper
. Его единственная задача состоит в том, чтобы пометить (или отменить -пометку )как subreaper , а затем по цепочке -загрузить другой образ программы в том же процессе.
В этом нет ничего специфического для Linux -, механизм поджатия доступен в нескольких операционных системах . Он работает на Linux и FreeBSD/TrueOS/DragonFlySBD и не имеет аппаратных -проводных номеров системных вызовов или чего-либо в этом роде. & #9786;
Также в набор инструментов для вырезов входят инструменты userenv
и setuidgid
. Они на самом деле делают все , что и программа TrueOS pcdm-session
, и даже больше, включая установку переменной DBUS_SESSION_BUS_ADDRESS
для указания на -брокера шины рабочего стола для каждого пользователя. Всю программу TrueOS pcdm-session
можно заменить на
#!/bin/sh - exec >>"$5" 2>&1 chown -v -h -- "$1" "${XAUTHORITY}" exec \ local-reaper true \ setuidgid --supplementary "$1" \ userenv --set-path --set-other --set-tools --set-timezone --set-locale --set-xdg \ sh "$4"
local-reaper
в эксплуатацию Чтобы использовать его, мне нужно было найти процессы, удовлетворяющие трем условиям:
Не все процессы были подходящими. На самом деле я обнаружил ошибку в программе TrueOS PCDM-session
, где она ждала неправильный идентификатор процесса, диагностируя, подходит ли процесс PCDM-session
в качестве поджатки.
(Я также рассказал об этой ошибке специалистам TrueOS. На самом деле это односимвольная опечатка.)
К счастью, программы оболочки почти всегда подходят для использования в качестве сборщиков, и в этом дереве было несколько процессов оболочки. Так же, как оказалось, было xinit
.
Итак, что происходит теперь ;
local-reaper true xinit …
, что также делает процесс xinit
поджнецом. xinit
предлагается запустить local-reaper true helper-script
, делая интерпретатор оболочки, который интерпретирует вспомогательный -сценарий , третьим поджатником. dbus-launch --exit-with-session PCDM-session
. Он торчит, запуская интерпретатор оболочки, ожидая завершения процесса PCDM-session
. dbus-launch
выделяет два побочных -процесса, которые он осиротел. PCDM-session
нельзя сделать вспомогательным жнецом. Его поведение не изменилось :он записывает одноразовый сценарий оболочки в /tmp
и порождает /usr/local/share/PCDM/pcdm-session
. Но выделение стороны шины рабочего стола -обработано для него уже сделано. /usr/local/share/PCDM/pcdm-session
помечает себя как поджнец и привязывается к sh /tmp/PCDM-session.blah
, написанному ранее сценарию. $HOME/.xprofile
и, следовательно, все в /usr/local/share/pcbsd/xstartup/
, и, наконец, запускает сеанс выбранного рабочего стола, но напрямую, а не через dbus-launch
. Он остается, запуская интерпретатор оболочки, ожидая завершения процесса сеанса рабочего стола. Последствия этого следующие:
/usr/local/share/pcbsd/xstartup/
, переназначаются для запущенного процесса sh /tmp/PCDM-session.blah
. thunderbird
, которые запускаются через fork -и -выходят из -родительского процесса как внуки процесса сеанса рабочего стола, переназначаются на процесс, работающий sh /tmp/PCDM-session.blah
. dbus-launch
, повторно -порождаются процессом helper-script
. dbus-daemon
побочный процесс не разветвлен;поскольку все указывает на -брокера Desktop Bus для каждого пользователя, который работает в другой части дерева процессов, как сервис уровня пользователя -при надлежащем управлении сервисом. xinit
. Делать из него субрипер оказалось ненужным. Дерево процессов, начиная с процесса #1, выглядит следующим образом:
/sbin/system-manager -- |-- cyclog --max-file-size 262144 --max-total-size 1048576. (system-manager) `-- service-manager (system-manager) … |-- per-user-manager | |-- cyclog --max-file-size 262144 --max-total-size 1048576. | `-- service-manager | |-- cyclog JdeBP/socket-servers/ | |-- cyclog JdeBP/dbus-servers/ | |-- dbus-daemon --config-file./per-user.conf --nofork --address=unix:path=/run/user/JdeBP//bus … |-- /bin/sh -./helper run `-- xinit /bin/exec local-reaper true./helper session -- :0 -auth -retro |-- X :0 -auth -retro (Xorg) `-- /bin/sh -./helper session |-- PCDM-session -once | `-- PCDM-session -once | `-- sh /tmp/PCDM-session.ca1015 | |-- /usr/local/bin/gpg-agent … | | `-- scdaemon --multi-server | |-- /usr/local/bin/lxsession -s LXDE | | |-- openbox --config-file … | | |-- lxpanel --profile LXDE | | |-- pcmanfm --desktop --profile LXDE | | `-- xscreensaver -no-splash | |-- /usr/local/bin/python2.7 /usr/local/share/system-config-printer/applet.py | |-- life-preserver-tray | |-- /usr/local/bin/pc-systemupdatertray | |-- zeitgeist-datahub | |-- pc-mixer | |-- pc-mounttray | |-- /usr/local/libexec/menu-cache/menu-cached … | `-- thunderbird |-- dbus-launch --exit-with-session PCDM-session -once `-- /usr/local/bin/dbus-daemon --fork … --session