Можно ли полностью управлять жизненным циклом процесса и его форками? - PullRequest
3 голосов
/ 25 января 2012

Рассмотрим систему, которая управляет пользовательскими программами:

  • Программа может быть любой. Его командная строка определена непривилегированными пользователями в некотором файле конфигурации. Это может быть /bin/ls, это может быть /usr/sbin/apache; пользователь может указать, что ему разрешено запускать.
  • Каждая программа запускается как пользователь без полномочий root.
  • Любой пользователь может настроить любое количество программ.
  • Каждая программа работает столько, сколько она хочет.
  • Каждая программа может вызывать fork(), exec() и т. Д.
  • Каждая программа может установить себя в качестве лидера сеанса (т. Е. setsid()).
  • Система, которая запускает программы, может работать не постоянно. Запускает программу, затем выходит.
  • Должно быть возможным действие «остановка всех процессов программы P., включая дочерние элементы / вилки».
  • Действие "найти все процессы, принадлежащие программе P" должно быть возможным.

Вот вопрос: как обеспечить такую ​​систему в рамках модели процесса Linux?

Наивный метод:

  • Запустите программу с fork(), exec(), setuid() и т. Д.
  • Запишите дочерний PID (плюс его начальную временную метку от /proc/stat, чтобы однозначно и постоянно идентифицировать его) в файл.
  • Чтобы остановить отдельный процесс, установите SIGTERM в PID.
  • Чтобы найти все процессы, проверьте /proc, чтобы построить иерархию процессов на основе PID.

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

Обходной путь должен гарантировать, что каждая программа запускается с уникальным UID. Это нежелательно или особенно выполнимо, поскольку (человек) пользователь может определять любое количество программ; Затем система должна будет программно создавать новых уникальных пользователей для каждой программы.

До сих пор моя единственная идея - ввести специальную, зарезервированную переменную среды в начальный процесс программы, т. Е. Запустить программу с env PROGRAM=myprogram <command line>. Затем система может потребовать, чтобы все процессы наследовали среду своего родителя. Через определенные промежутки времени система может тралить /proc и принудительно уничтожать любой процесс, в котором отсутствует переменная окружения PROGRAM.

Есть ли какие-нибудь секреты в системном API Linux, которые я мог бы использовать?

1 Ответ

2 голосов
/ 25 января 2012

(1) Действие «остановить все процессы программы P, включая дочерние элементы / вилки», должно быть возможным.(2) Должно быть возможным действие «найти все процессы, принадлежащие программе P.»

cgroups реализуют это, и systemd, возможно, самый тяжелый пользователь на сегодняшний день, который может использовать (2) для достижения (1).Вы можете выйти из групп прогресса, но не из групп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...