我们可以使用命令来确定进程的所有者ps
。这是否意味着其他用户无法运行/终止/恢复该进程?
答案1
读凭证(7),叉子(2),执行(2)。这fork系统调用是创建流程的方式(如今,fork
通常通过以下方式实现)克隆(2)但您可以将其视为实现细节)。这执行系统调用就是这样可执行文件程序启动。请记住,一切都是通过某些流程完成的系统调用(列于系统调用(2))。第一个过程(在里面或者系统)已在启动时由内核神奇地启动。其他进程已启动叉子(2)。现代 Linux 内核有时(但很少)会神奇地启动一些特殊进程(例如/sbin/hotplug
)或内核线程(例如kworker
,kswapd
......)。
所以是的,每个过程(以及每个文件)都有一些所有者(技术上来说uid,一个小的非负数)和组(gid)。 0 uid 是 root 的,有额外的权限。
这是否意味着其他所有者无法运行该进程?
一个过程是已经正在运行(但它可能处于空闲或等待状态),因此没有人可以再次运行它。不要将进程(动态的东西)与程序(可执行文件)混淆文件,经常在极低频格式)在其中运行。
给定的程序(例如/bin/bash
)可以在一些流程。许多可执行文件保留在磁盘上,而(在给定时刻)没有任何进程运行它们。
在 Linux 上,过程(5)对于查询内核有关进程状态的信息非常有用。尝试举例cat /proc/$$/status
和cat /proc/self/maps
。也可以看看pgrep(1),附注(1),顶部(1)。
每个进程都有自己的虚拟地址空间, 它自己的文件描述符表,自己的工作目录,(并且经常有几个线程, 看并行线程(7))等等等等...
这是否意味着其他所有者无法运行/终止/恢复该进程?
运行一个进程没有任何意义(它是已经跑步)。但是,pid 1234 进程的可执行文件可作为/proc/1234/exe
符号链接使用,您可以将其用于执行(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
) 信号杀死(2)。看信号(7)。
到恢复停止的进程,使用该SIGCONT
信号。
答案2
所有者通常是启动该进程的用户。该命令可能可由其他用户执行,但这将是一个不同的过程。
这是否意味着其他所有者无法运行该进程?
没有其他主人。不要混淆程序(可执行文件)和进程(运行程序)。
这是否意味着其他所有者无法运行/终止/恢复该进程?
单一业主已经启动了该流程。如果你指的是其他用户,而不是所有者,这取决于。
root,即等于0的用户uid
,拥有全权。从操作系统的角度来看,共享相同内容的其他用户uid
是同一用户,因此也对该进程拥有完全的权力。
具有不同 uid 的用户将无法终止/停止/恢复该进程,除非允许他们通过sudo
类似命令切换到所有者或 root 权限,或者在较小程度上,如果他们与该进程相关从他们的等级制度中。