Perl — не является ссылкой HASH или не может использовать строку ("...") в качестве ссылки HASH, пока используются "строгие ссылки"

На самом деле я сделал это с TrueOS (, ранее известной как PC -BSD ), чуть меньше года назад.

ванильная TrueOS

В vanilla TrueOS служба pcdmзапускает графический интерфейс пользователя.

  • В системе Mewburn 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

1
17.12.2019, 22:59
0 ответов

Теги

Похожие вопросы