Создайте пространство имен PID
Правильная команда для использования здесь unshare
. Обратите внимание, что необходимые опции для этого доступны только из util-linux 2.23
. Идея состоит в том, чтобы создать новое пространство имен PID для программы, которую вы запускаете, так что все ее дочерние элементы также создаются в этом пространстве имен. Вы можете запустить команду в новом пространстве имен PID, просто выполнив:
sudo unshare -fp some_command
Чтобы запустить оболочку, просто пропустите команду. Это создаст процесс, который, как и любой из его дочерних элементов, будет иметь PID, как обычно, в родительском (системном) пространстве имен. Однако в новом пространстве имен он будет иметь PID, 1
а также некоторые специальные характеристики init
процесса. Возможно, наиболее важной характеристикой с точки зрения мониторинга является то, что если какой-либо из его потомков осиротят, они будут заново связаны с этим процессом, а не с реальным init
процессом.
Простого выполнения этого может быть достаточно для большинства случаев мониторинга. Как упоминалось ранее, все процессы в пространстве имен имеют идентификаторы PID в родительском пространстве имен, поэтому для мониторинга их активности можно использовать обычные команды. Мы также уверены, что если какой-либо процесс в пространстве имен станет осиротевшим, он не выпадет из ветвей дерева процессов под PID программы верхнего уровня, что означает, что его все еще можно легко отслеживать.
Объединить с пространством имен mount
Однако то, что мы не можем сделать, это контролировать процесс в отношении идентификатора PID, который, по его мнению , имеет. Для этого и, в частности, чтобы иметь возможность использовать ps
команду в новом пространстве имен, вам необходимо смонтировать отдельную procfs
файловую систему для пространства имен. Это, в свою очередь, приводит к другой проблеме, поскольку единственное место, которое ps
принимает, procfs
- это /proc
. Одним из решений будет создание chroot
тюрьмы и установка там нового procfs
. Но это громоздкий подход, поскольку как минимум нам потребуется скопировать (или, по крайней мере, жесткую ссылку) любые двоичные файлы, которые мы намереваемся использовать вместе с любыми библиотеками, от которых они зависят, до нового корня.
Решением является также использование нового пространства имен монтирования . В рамках этого мы можем смонтировать новый procfs
способ, который использует истинный корневой /proc
каталог, может быть использован в пространстве имен PID и не мешает ничему другому. Чтобы сделать этот процесс очень простым, unshare
команда дает --mount-proc
возможность:
sudo unshare -fp --mount-proc some_command
Теперь при выполнении ps
в объединенных пространствах имен будут отображаться только процессы с пространством имен PID и процесс верхнего уровня будет иметь PID, равный 1
.
Как насчет nsenter
?
Как следует из названия, nsenter
может использоваться для ввода пространства имен, которое уже было создано с помощью unshare
. Это полезно, если мы хотим получить информацию, доступную только из пространства имен, из сценария, не связанного с другой. Самый простой способ - это указать PID любой программы, работающей в пространстве имен. Чтобы было ясно, это должен быть PID целевой программы в пространстве имен, из которого nsenter
выполняется (поскольку пространства имен могут быть вложенными, у одного процесса может быть много PID). Чтобы запустить оболочку в целевом пространстве имен PID / mount, просто выполните:
sudo nsenter -t $PID -m -p
Если это пространство имен настроено, как указано выше, ps
теперь будут перечислены только процессы в этом пространстве имен.