← Назад к вопросам

Покажет ли команда ps aux контейнеры других пользователей в Linux

1.7 Middle🔥 61 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Краткий ответ

Нет, команда ps aux по умолчанию НЕ покажет контейнеры (процессы), принадлежащие другим пользователям в Linux, если вы не обладаете привилегиями суперпользователя (root). Однако, это утверждение требует важных уточнений, особенно в контексте современных контейнерных технологий, таких как Docker и Podman.

Детальное объяснение работы ps aux и пространств имён (namespaces)

1. Базовое поведение команды ps

Команда ps aux выводит информацию о всех процессах в системе (a), с детализацией по пользователям (u) и без ограничения по владельцу терминала (x). Ключевой момент заключается в том, что в традиционной Linux-системе без контейнеров:

  • Обычный пользователь увидит все процессы, но для процессов других пользователей некоторые чувствительные колонки (например, аргументы командной строки в args) могут быть скрыты или заменены на скрывающие символы, в зависимости от настроек ядра (kernel.yama.ptrace_scope) и параметров ps.
  • Суперпользователь (root) всегда видит всю информацию о всех процессах.

Однако в мире контейнеров всё меняется из-за механизма пространств имён (namespaces).

2. Роль пространства имён PID (PID namespace)

Контейнерные технологии изолируют процессы с помощью пространства имён PID. Это означает:

  • Процессы внутри контейнера имеют собственный нумерованный набор PID, начиная с 1 (например, nginx внутри контейнера может иметь PID 1).
  • С точки зрения хостовой системы (host machine), эти процессы являются обычными процессами, но они "спрятаны" в отдельное дерево PID-пространства.

Важное следствие: Когда вы, как пользователь на хост-машине, выполняете ps aux, вы по умолчанию находитесь в корневом (root) PID namespace. Поэтому вы увидите все процессы, запущенные на хосте, включая те, что являются процессами контейнеров, но отображённые с их хостовыми PID.

Пример вывода на хосте, где запущен Docker-контейнер:

# На хосте, от пользователя с правами sudo или root
$ ps aux | grep nginx
root      12345  0.0  0.5  70000  8000 ?        Ss   10:00   0:00 nginx: master process
1000      12346  0.0  0.2  30000  4000 ?        S    10:00   0:00 nginx: worker process

Здесь процессы nginx из контейнера видны на хосте. Пользователь 1000 — это UID, с которым работает процесс внутри контейнера, отображённый на хосте.

3. А что видит пользователь ВНУТРИ контейнера?

Если вы зайдёте внутрь контейнера и выполните ps aux, вы увидите только процессы, находящиеся в том же PID namespace, то есть процессы этого контейнера (и, возможно, его дочерних пространств, если они есть). Процессы других контейнеров и хостовой системы видны не будут.

# Внутри контейнера
$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  70000  3000 ?        Ss   10:00   0:00 nginx: master process
nginx        5  0.0  0.0  30000  1500 ?        S    10:00   0:00 nginx: worker process

4. Права доступа и безопасность

  • Обычный пользователь на хосте сможет увидеть процессы контейнеров в выводе ps aux, если они запущены от его же UID или если контейнерные процессы работают от общедоступных UID. Однако детальная информация (полный путь к исполняемому файлу, аргументы) может быть ограничена.
  • Для просмотра всех процессов со всеми деталями необходимы права root или использование sudo.
  • Пользователь внутри контейнера (даже root внутри контейнера) не может увидеть процессы на хосте или в других контейнерах через ps, благодаря изоляции пространства имён. Это фундаментальный принцип безопасности контейнеризации.

5. Специальные инструменты для мониторинга контейнеров

Для мониторинга контейнеров на уровне хоста лучше использовать специализированные команды, которые "понимают" пространства имён:

  • Для Docker: docker ps (статус контейнеров), docker top <container> (процессы внутри конкретного контейнера).
  • Для Podman: podman ps, podman top.
  • Универсальные утилиты:
    * `pstree -p` — наглядное дерево процессов.
    * `lsns` — список всех пространств имён в системе.
    * `ps auxf` — вывод в формате леса (дерева), где можно увидеть родительско-дочерние связи, полезно для идентификации процессов-родителей контейнеров (например, `containerd-shim`, `runc`).

Пример использования docker top:

$ sudo docker top my_nginx_container
UID    PID    PPID   C   STIME   TTY   TIME       CMD
root   12345  12320  0   10:00   ?     00:00:00   nginx: master process
nginx  12346  12345  0   10:00   ?     00:00:00   nginx: worker process

Вывод

Итак, команда ps aux, выполненная на хост-машине, покажет процессы всех контейнеров как обычные процессы системы, потому что они таковыми и являются с точки зрения ядра. Вопрос о "пользователях" решается стандартными механизмами прав Linux: не-root пользователь может видеть эти процессы, но с возможными ограничениями в детализации. Истинная изоляция (ps aux внутри контейнера не показывает процессы снаружи) обеспечивается не правами пользователя, а механизмом PID namespaces, который является краеугольным камнем контейнерных технологий. Для эффективной работы в DevOps-среде необходимо понимать эту разницу между изоляцией пространств имён и классическими правами доступа Unix.

Покажет ли команда ps aux контейнеры других пользователей в Linux | PrepBro