Мы можем определить владельца процесса с помощью ps
команды. Означает ли это, что другие пользователи не могут запустить / убить / возобновить этот процесс?
Прочитайте учетные данные (7) , форк (2) , execve (2) . Система вилки вызова является способом создаются процессы (сегодня, fork
часто реализуются с клоном (2) , но вы можете видеть , что в качестве деталей реализации). Exec системного вызова путь исполняемые запускаются программы. Помните, что все делается из какого-то процесса с некоторыми системными вызовами (перечислены в syscalls (2) ). Самый первый процесс ( init или systemd ) был волшебным образом запущен ядром во время загрузки. Другие процессы были запущены fork (2), Современные ядра Linux иногда - но редко - магически запускают несколько специальных процессов (например /sbin/hotplug
) или потоков ядра (например kworker
, kswapd
....).
Так что да, каждый процесс (и каждый файл) имеет своего владельца (технически uid , небольшое неотрицательное число) и группу (gid). 0 uid для root и имеет дополнительные разрешения.
Читайте также о setuid (и setreuid (2) ...) Это сложно.
это означает, что другой владелец не может запустить этот процесс?
Процесс уже запущен (но он может быть бездействующим или ожидающим), поэтому никто не сможет запустить его снова. Не путайте процесс (что-то динамическое) с программой (исполняемый файл , часто в формате ELF ), работающей внутри него.
Данная программа (например /bin/bash
) может быть выполнена в нескольких процессах. Многие исполняемые файлы остаются на вашем диске без каких-либо (в данный момент) процессов, выполняющих их.
В Linux proc (5) очень полезен для запроса ядра о состоянии процессов. Попробуйте для примеров cat /proc/$$/status
и cat /proc/self/maps
. Смотрите также pgrep (1) , ps (1) , top (1) .
Каждый процесс имеет свое собственное виртуальное адресное пространство , свою собственную таблицу дескрипторов файлов , свой собственный рабочий каталог (и часто несколько потоков , см. Pthreads (7) ) и т. Д. И т. Д.
Означает ли это, что другие владельцы не могут запустить / убить / возобновить этот процесс?
Запуск процесса не имеет никакого смысла (он уже запущен). Однако, исполняемый файл процесса pid 1234 доступен как /proc/1234/exe
символическая ссылка, и вы можете использовать это для execve (2) - но вы, вероятно, не должны -. Правила разрешения execve
применяются.
Чтобы убить (2) процесс, вы обычно должны иметь такой же uid. Однако в документации сказано:
For a process to have permission to send a signal, it must either be privileged (under Linux: have the CAP_KILL capability in the user namespace of the target process), or the real or effective user ID of the sending process must equal the real or saved set-user-ID of the target process. In the case of SIGCONT, it suffices when the sending and receiving processes belong to the same session.
Чтобы остановить процесс, используйте сигнал SIGSTOP
(или SIGTSTP
), используемый с kill (2) . Смотрите сигнал (7) .
Чтобы возобновить остановленный процесс, используйте SIGCONT
сигнал.
Обычно владельцем является пользователь, запустивший этот процесс. Команда может быть выполнена другими пользователями, но это будет другой процесс.
это означает, что другой владелец не может запустить этот процесс?
Нет другого владельца. Не путайте программы (исполняемые файлы) и процессы (запущенные программы).
Означает ли это, что другие владельцы не могут запустить / убить / возобновить этот процесс?
Единственный владелец уже запустил процесс. Если вы имеете в виду других пользователей , а не владельцев, это зависит.
Root, то есть пользователь с uid
равным 0, имеет полную мощность. Другие пользователи, использующие то же самое uid
, с точки зрения операционной системы, являются одним и тем же пользователем, поэтому также имеют полную мощность для этого процесса.
Пользователи с другим uid не смогут завершить / остановить / возобновить процесс, если только им не разрешено переключаться на владельца или привилегию root с помощью sudo
или аналогичной команды или, в меньшей степени, если они связаны с этим процессом из их иерархии.