Intereting Posts
Удалять файлы старше X дней – mtime, ctime и atime не работают Отсутствуют метаданные LVM, пытаясь воссоздать рейд 1 с LVM Измените ключ, который показывает предыдущие командные строки в ksh Удаление расширения только из первого столбца Управление фоновым процессом Разделяйте входной файл на три столбца и сортируйте его по третьему столбцу OpenBSD не доступен через SSH без графического процессора Вам нужно указать опцию «defaults» в fstab? Как создать таймер блокировки экрана для Awesome WM? Привязка / развязка графического процессора между ОС хоста и pci-заглушкой во время работы хост-системы Создание дерева символических ссылок в существующих каталогах Проблема туннелирования X с удаленной машины autojump получил разрешение bash отклонил ошибку Пара арифметических связанных команд, Dash, POSIX shell, sh, Increment xinput – Ctrl + <Left> неправильно, если сопоставление истории-поиска-назад

Есть ли возможность установить родительский процесс при создании нового процесса?

Я бы хотел установить родителя недавно начатого процесса, возможно ли это?

Предположим, что мы запускаем новый сеанс среды рабочего стола с помощью менеджера входа в систему, поэтому наше дерево процессов будет выглядеть примерно так:

init \- login-manager \- de-session 

Теперь у меня есть сценарий для запуска самых важных приложений, которые должны начинаться с сеанса, по разным причинам я хотел бы сохранить их как сценарий, а не переносить их в автозапуск менеджера любого DE. Это выглядит примерно так:

 #!/usr/bin/env application1 & application2 & application3 & 

После запуска этого автоматически в начале сеанса наше дерево процессов выглядит следующим образом:

 init |- application1 |- application2 |- application3 \- login-manager \- de-session 

Но мне бы хотелось, чтобы эти процессы были «репаратны» в рамках сессии:

 init \- login-manager \- de-session |- application1 |- application2 \- application3 

Итак, есть ли способ «повторить» процесс под другим?

На нескольких системах вы можете отметить процесс как дочернюю подстроку , что заставляет занять роль init в принятии сиротских процессов для всех его потомков.

В Linux это делается с PR_SET_CHILD_SUBREAPER prctl() .

Таким образом, вы можете начать свой de-session как (здесь hardcoding значение PR_SET_CHILD_SUBREAPER для Linux):

 perl -e 'require "syscall.ph"; syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!"; exec("de-session");' 

Но de-session может запутаться, когда она получит сигналы SIGCHLD для процессов, которые она никогда не создавала. Ваш init был разработан для решения этих проблем, но, вероятно, не для вашего de-session , поэтому вы можете обнаружить, что вы получаете армию зомби, поскольку de-session никогда не признает смерть тех процессов, которые она никогда не хотела наследовать.

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

ваниль TrueOS

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

  • В системе Mewburn rc выполняется сценарий /usr/local/etc/rc.d/pcdm , который не является долговечным.
  • Бесконечно циклический и вполне запутанный сценарий оболочки с именем PCDMd порождает xinit говорящий ему, чтобы запустить программу с именем PCDM-session .
  • PCDM-session – это программа для PCDM-session рабочего стола и программа входа в систему, которая записывает сценарий оболочки nonce в /tmp . Он запускает /usr/local/share/PCDM/pcdm-session . Он также вращается и сироты dbus-daemon , запускаются как суперпользователь, на стороне, если он не передал информацию о настольной шине, с которой можно было поговорить.
  • /usr/local/share/PCDM/pcdm-session для /usr/local/share/PCDM/pcdm-session sh /tmp/PCDM-session. blah sh /tmp/PCDM-session. blah , написанный ранее.
  • Сказанный сценарий оболочки, в свою очередь, запускает все в $HOME/.xprofile , в котором все вещи, такие как gpg-agent , разветвляются и, наконец, запускает сеанс выбранного рабочего стола через dbus-launch (запускается как зарегистрированный пользователь и откручивание другого процесса dbus-daemon ).

Это приводит к довольно беспорядочному дереву процессов, как для любого, от которого $HOME/.xprofile (который запускает все из /usr/local/share/pcbsd/xstartup/ ), так и для чего-либо, запущенного в процессе сеанса рабочего стола, а затем осилизованного через fork-and-exit-parent (например, увы, thunderbird ). Все брокеры D-Bus тоже некрасивы; многие вещи заканчиваются процессом №1 в качестве родительского идентификатора процесса. Именование тоже не помогает сделать это. pcdm вызывает PCDMd вызывает PCDM-session pcdm-session вызывает PCDM-session. blah PCDM-session. blah .

( Я пытался позволить людям TrueOS знать, что это было излишне сложным , особенно совершенно ненужным скрытым дополнительным и сломанным диспетчером службы внутри программы PCDM-session которую я оставил в приведенном выше описании.)

local-reaper userenv и пользовательский userenv из набора инструментов userenv

В наборе инструментов nosh есть небольшая утилита загрузки по цепочке с именем local-reaper . Его единственной задачей является отметка (или un-mark) сама по себе в качестве подмашины, а затем загрузка одной другой программы в один и тот же процесс.

В этом нет ничего конкретного для Linux, механизм подзаголовков доступен в нескольких операционных системах . Он работает на Linux и FreeBSD / TrueOS / DragonFlySBD и не имеет жестких системных номеров вызовов или чего-либо подобного. ☺

Также в наборе инструментов userenv setuidgid инструменты userenv и setuidgid . На самом деле они делают все, что pcdm-session программа pcdm-session TrueOS, и, кроме того, включая настройку переменной DBUS_SESSION_BUS_ADDRESS чтобы указать на брокера на основе пользовательской шины. Вся программа pcdm-session TrueOS на самом деле pcdm-session

  #! / bin / sh -
 exec >> "$ 5" 2> & 1 
 chown -v -h - "$ 1" "$ {XAUTHORITY}"
 exec \
 local-reaper true \
 setuidgid - дополняющий «$ 1» \
 userenv --set-path --set-other --set-tools --set-timezone --set-locale --set-xdg \
 sh "$ 4" 

использование local-reaper

Чтобы использовать его, мне пришлось найти процессы, удовлетворяющие трем условиям:

  • Они должны были быть косвенным родителем процессов, которые становились сиротами.
  • Они должны были долго жить.
  • Они должны были быть способны внезапно получить детские процессы, которых они не ожидали.

Не все процессы были подходящими. Я действительно обнаружил ошибку в программе TrueOS PCDM-session , где он ожидал неправильного идентификатора процесса, а также диагностировал, подходит ли PCDM-session PCDM для подребер.

( Я тоже сказал людям TrueOS об этой ошибке. Это на самом деле одна ошибка ввода символов ).

К счастью, программы оболочки почти всегда подходят для жнецов, и в этом дереве было несколько процессов оболочки. Так и оказалось, было xinit .

улучшенное дерево процессов

Итак, что происходит сейчас ;

  • Я управляю вещами под правильным менеджером сервиса. Процесс диспетчера сервера сам по себе является подреберной.
  • Управление сервисами порождает значительно более короткий сценарий оболочки, который порождает local-reaper true xinit … , что делает процесс xinit также подкованным.
  • xinit предлагается запустить local-reaper true helper-script , что делает интерпретатор интерпретатора, который интерпретирует вспомогательный скрипт третьего подкаталога.
  • helper-script запускает dbus-launch --exit-with-session PCDM-session . Он работает, используя интерпретатор оболочки, ожидая PCDM-session процесса PCDM-session . dbus-launch отталкивает два боковых процесса, которые он сироты.
  • PCDM-session не может быть сделана подстрокой. Его поведение не изменилось: он выписывает сценарий оболочки nonce в /tmp и spawns /usr/local/share/PCDM/pcdm-session . Но для него уже сделано отключение обработки Desktop Bus.
  • Пересмотренный /usr/local/share/PCDM/pcdm-session обозначает себя как подстрочный блок и соединяется с sh /tmp/PCDM-session. blah sh /tmp/PCDM-session. blah , написанный ранее.
  • В свою очередь, этот сценарий оболочки все еще запускает все в $HOME/.xprofile и, следовательно, все в /usr/local/share/pcbsd/xstartup/ , и, наконец, запускает сеанс выбранного рабочего стола, но напрямую и не dbus-launch через dbus-launch . Он работает, используя интерпретатор оболочки, ожидая завершения сеанса рабочего стола.

Последствия этого следующие:

  • Вещи, отколовшиеся от любого из сценариев в /usr/local/share/pcbsd/xstartup/ используются для процесса, выполняющего sh /tmp/PCDM-session. blah sh /tmp/PCDM-session. blah .
  • Настольные приложения, такие как thunderbird , которые запускаются через fork-and-exit-parent как внуки процесса сеанса рабочего стола, повторно обрабатываются процессом, выполняющим sh /tmp/PCDM-session. blah sh /tmp/PCDM-session. blah .
  • Боковые процессы, раздвоенные и потерянные при dbus-launch , переопределены для процесса helper-script .
  • Отсутствует процесс dbus-daemon пользователя dbus-daemon ; поскольку все указывает на брокера на основе пользовательской шины, который работает в другой части дерева процессов, в качестве службы пользовательского уровня при правильном управлении сервисом.
  • Ничто не доходит до того, чтобы быть репрессированным для xinit . Сделать его подвалом оказалось ненужным.

Дерево процессов, начиная с процесса # 1, выглядит так:

  / sbin / системный менеджер -
 | - Велосипед | --Ваша первая категория | --Ваш первый форум  (Система-менеджер)
 `- сервис-менеджер (системный менеджер)
   ...
   | - Общение
   |  | - Велосипед | --Ваша первая категория | --Ваш первый форум
   |  `- сервис-менеджер
   |  | - Общение
   |  | - Охота и рыбалка
   |  | - 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 сеанс
        | - Охота и рыбалка
        |  `- PCDM-session -once
        |  `- sh /tmp/PCDM-session.ca1015
        |  | - / usr / local / bin / gpg-agent ...
        |  |  `- scdaemon --multi-server
        |  | - / usr / local / bin / lxsession -s LXDE
        |  |  | - Охота и рыбалка
        |  |  | - Охота и рыбалка
        |  |  | - Охота и рыбалка
        |  |  `- xscreensaver -no-splash
        |  | --Исполнитель /
        |  | - Охота и рыбалка
        |  | - / usr / local / bin / pc-systemupdatertray
        |  | - Охота и рыбалка
        |  | - Общение
        |  | - Охота и рыбалка
        |  | - / usr / local / libexec / menu-cache / menu-cached ...
        |  `- thunderbird
        | - Охота и рыбалка
        `- / usr / local / bin / dbus-daemon --fork ... --session