[TOC]
进程知识
1、僵尸进程
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源 我们都知道进程的工作原理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。 进程停止后, 该进程就会从进程表中移除。 你可以通过 System-Monitor 查看当前进程。 In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程。
1-1、杀死僵尸进程
top命令会查看到僵尸进程,不占用内存cpu,zombie就是僵尸进程 ps aux | grep python 找到僵尸进程的父进程 kill -9 父进程ID
1-2、确定杀不掉进程的原因
- 这个进程是僵尸进程
- 此进程是"核心态"进程。
2、LINUX下PS -EF和PS AUX的区别
Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux。这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同。现在的大部分Linux系统都是可以同时使用这两种方式的。
ps -ef 是用标准的格式显示进程的。
UID //用户ID、但输出的是用户名
PID //进程的ID
PPID //父进程ID
C //进程占用CPU的百分比
STIME //进程启动到现在的时间
TTY //该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
CMD //命令的名称和参数
ps aux 是用BSD的格式来显示。
USER //用户名
%CPU //进程占用的CPU百分比
%MEM //占用内存的百分比
VSZ //该进程使用的虚拟內存量(KB)
RSS //该进程占用的固定內存量(KB)(驻留中页的数量)
STAT //进程的状态
START //该进程被触发启动时间
TIME //该进程实际使用CPU运行的时间
其中STAT状态位常见的状态字符有
D //无法中断的休眠状态(通常 IO 的进程);
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;
注意一点,ps -l和ps l两者使用起来的结果是不同的,类似的有很多。注意还需要区分大小写ps -L。
[root@ubuntu0006:~] #ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 12399 12006 0 80 0 - 6468 wait pts/4 00:00:00 bash
0 S 0 16599 12399 0 80 0 - 3853 wait pts/4 00:00:00 bash
0 S 0 16670 16599 0 80 0 - 2533 hrtime pts/4 00:00:00 sleep
0 R 0 17098 12399 0 80 0 - 7940 - pts/4 00:00:00 ps
[root@ubuntu0006:~] #ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1226 1086 20 0 553504 61192 poll_s Ssl+ tty7 2:43 /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7
4 0 2695 1 20 0 18780 1776 poll_s Ss+ tty1 0:00 /sbin/agetty --noclear tty1 linux
4 0 12399 12006 20 0 25872 5668 wait Ss pts/4 0:00 -bash
0 0 16599 12399 20 0 15412 3048 wait S pts/4 0:00 bash test.sh
0 0 17150 16599 20 0 10132 696 hrtime S pts/4 0:00 sleep 2
0 0 17162 12399 20 0 31760 1452 - R+ pts/4 0:00 ps l
4 0 31812 1 20 0 25792 5376 wait_w Ss+ tty2 0:00 /bin/bash
[root@ubuntu0006:/proc/23416/task/23417] #ps -l -p 23416
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 23416 12399 99 80 0 - 20062 futex_ pts/4 00:10:10 a.out
[root@ubuntu0006:/proc/23416/task/23417] #ps -L -p 23416
PID LWP TTY TIME CMD
23416 23416 pts/4 00:00:00 a.out
23416 23417 pts/4 00:10:25 wangzherongyao
使用man ps官方解答:
l Display BSD long format.
-l Long format. The -y option is often useful with this.
-L Show threads, possibly with LWP and NLWP columns.
3、PS命令
PS,是Linux系统命令之一,是在Linux中是查看进程的命令。ps查看正处于Running的进程,ps aux查看所有的进程。
3-1、进程状态
- 运行状态(正在运行或在运行队列中等待[就绪队列])
- 中断状态(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断状态(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死状态(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止状态(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
3-2、PS工具标识进程的5种状态码
- D 不可中断 uninterruptible sleep (usually IO)
- R 运行 runnable (on run queue)
- S 中断 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (”zombie”) process
3-3、相关参数
-e 显示所有进程。 -f 全格式。 -h 不显示标题。 -l 长格式。 -w 宽输出。 a 显示终端上的所有进程,包括其他用户的进程。 r 只显示正在运行的进程。 x 显示没有控制终端的进程。 O[+|-] k1 [,[+|-] k2 [,…]] 根据SHORT KEYS、k1、k2中快捷键指定的多级排序顺序显示进程列表。 --sort X[+|-] key [,[+|-] key [,…]] 从SORT KEYS段中选一个多字母键。“+”字符是可选的,因为默认的方向就是按数字升序或者词典顺序。比如: ps -jax -sort=uid,-ppid,+pid。 --help 显示帮助信息。 --version 显示该命令的版本信息。
详细见man ps,有非常非常的多。