Linux 进程常见状态说明
状态标识 | 状态名称 | 状态说明 | 示例 |
---|---|---|---|
R |
task_running | 进程处于运行或就绪状态 | |
S |
task_interruptible sleeping |
可中断的睡眠状态 | |
D |
task_uninterruptible | 不可中断的睡眠状态 1. 它是一种睡眠状态,意味着处于此状态的进程不会消耗 CPU 2. 睡眠的原因是等待某些资源(比如锁或者磁盘 IO),这也是非常多 D 状态的进程都处在处理 IO 操作的原因 3. 是它不能被中断,这个要区别于 硬件中断 的中断,是指不希望在其获取到资源或者超时前被终止。因此他不会被信号唤醒,也就不会响应 kill -9 这类信号。这也是它跟 S(可中断睡眠) 状态的区别 |
|
T |
task_stopped task_traced Traced |
暂停状态或跟踪状态 | |
Z |
task_dead exit_zombie zombie |
退出状态,进程成为僵尸进程 | |
X |
task_dead exit_dead |
退出状态,进程即将被销毁 | |
I |
idle | 空闲状态 |
进程命令名和进程可执行文件名
在系统中遇到以下进程:
ps -elf | grep 18686 |
其中 PID 为 18686
的进程名为 /usr/sbin/CROND
,其启动了另外两个子进程。但是在系统中检查,并不存在路径 /usr/sbin/CROND
ls -l /usr/sbin/CROND |
出现此种现象,主要是因为 在启动时,进程的命令名是根据路径传递给 execve()
函数的参数决定的,而不是直接与系统中的文件进行匹配。
在 Linux 系统中,ps
命令显示的进程信息是从 /proc
文件系统中获取的,而 /proc
文件系统包含有关正在运行的进程的信息,包括每个进程的命令名。因此,即使实际上系统中不存在 /usr/sbin/CROND
文件,但如果进程的命令名是 /usr/sbin/CROND
,那么 ps
命令仍然会显示进程的命令名为 /usr/sbin/CROND
。
进程的命令名可以查看 /proc/<PID>/cmdline
文件,本示例中显示如下:
cat /proc/18686/cmdline |
对应的系统上的可执行文件的名称可以查看 /proc/<PID>/stat
、/proc/<PID>/comm
、/proc/<PID>/status
等文件
cat /proc/900/comm |
在本示例中,实际执行的命令为 crond