1、关于ps aux的STAT状态解释
不管在面试中还是平时排查进程相关问题中总会使用到ps这个命令,会显示很多进程相关信息,其中STAT栏的在问题排查中是比较重要的,面试中也经常遇到【反正我遇到过几次,强行解释,哈哈】,因此花点时间搞明白,废话不多说,请往下看:
[root@localhost shell]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 191444 4448 ? Ss Mar28 0:13 /usr/lib/sy
root 2 0.0 0.0 0 0 ? S Mar28 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Mar28 0:00 [kworker/0:
root 6 0.0 0.0 0 0 ? S Mar28 0:00 [ksoftirqd/
root 7 0.0 0.0 0 0 ? S Mar28 0:00 [migration/
root 8 0.0 0.0 0 0 ? S Mar28 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S Mar28 0:12 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Mar28 0:00 [lru-add-dr
root 11 0.0 0.0 0 0 ? S Mar28 0:02 [watchdog/0
以上是ps命令的输出信息,其他几列其实不难理解,比较难理解的是STAT 这列,man ps有关于STAT的解释:
状态 | 英文 | 解释 |
---|---|---|
D | uninterruptible sleep (usually IO) | 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生 |
R | running or runnable (on run queue) | 正在运行,或在队列中的进程 |
S | interruptible sleep (waiting for an event to complete) | 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号) |
T | stopped by job control signal | 已停止的,进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行 |
t | stopped by debugger during the tracing | 在跟踪期间被调试器停止 |
W | paging (not valid since the 2.6.xx kernel) | 正在换页(2.6.内核之前有效) |
X | dead (should never be seen) | 死掉的进程 |
Z | defunct (“zombie”) process, terminated but not reaped by its parent | 僵尸进程,程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的 |
< | high-priority (not nice to other users) | 表示高优先级的进程 |
N | low-priority (nice to other users) | 表示低优先级的进程 |
L | has pages locked into memory (for real-time and custom IO) | 被锁定的进程 |
s | is a session leader | 某一个回话的leader进程 |
l | is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) | 多线程,克隆线程 |
+ | is in the foreground process group | 后台运行进程组 |
关于+
使用man查看解释是前台进程,其实是后台进程,可以使用一个脚本放在后台运行,查看进程,他的STAT就会带一个+
2、使用shell脚本统计Linux中的进程数量
脚本如下,获取/proc/文件夹下的进程信息并计算各个进程的数量
#!/bin/bash
all_process=$(ls /proc/ | egrep '[0-9]+')
running_count=0
stoped_count=0
sleeping_count=0
zombie_count=0
for pid in ${all_process[*]}
do
test -f /proc/$pid/status && state=$(egrep "State" /proc/$pid/status | awk '{print $2}')
case "$state" in
R)
running_count=$((running_count+1))
;;
T)
stoped_count=$((stoped_count+1))
;;
S)
sleeping_count=$((sleeping_count+1))
;;
Z)
zombie_count=$((zombie_count+1))
echo "$pid" >> zombie.txt
kill -9 "$pid"
;;
esac
done
echo -e "total: $((running_count+stoped_count+sleeping_count+zombie_count))\nrunning: $running_count\nstoped: $stoped_count\nsleeping: $sleeping_count\nzombie: $zombie_count"