【Linux系列】再谈僵尸进程的产生与避免

Linux 进程管理命令介绍

ps、pstree、top、htop、nice、renice、kill、ulimit、w 和 who 和 whoami、pgrep、fg 和 bg、ipcs

  1. ps:查看 Linux 中当前运行的进程的命令。能列出系统中运行的进程,包括进程号、命令、CPU使用量、内存使用量等
示例:
    ps -a         - 列出所有运行中/激活进程
    ps -ef |grep   - 列出需要进程
    ps -aux     - 显示进程信息,包括无终端的(x)和针对用户(u)的进程:如USER, PID, %CPU, %MEM等
  1. pstree :linux中每一个进程都是由其父进程创建的。pstree以可视化方式显示进程,通过显示进程的树状图来展示进程间关系。如果指定了pid了,那么树的根是该pid,不然将会是init(pid: 1)。

  2. top:实时的监控系统状态信息和进程所使用的资源。显示进程的数据包括 PID、进程属主、优先级、%CPU、%memory等。可以使用这些显示指示出资源使用量。

  3. nice:通过 nice 命令的帮助,用户可以设置和改变进程的优先级。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。默认情况下,进程以 0 的优先级启动。进程优先级可以通过 top 命令显示的 NI(nice value)列查看。
    进程优先级值的范围从-20到19。值越低,优先级越高。nice <优先值> <进程名> - 通过给定的优先值启动一个程序

  4. renice:renice 命令类似 nice 命令。使用这个命令可以改变正在运行的进程优先值。
    注意,用户只能改变属于他们自己的进程的优先值。
    renice -n -p - 改变指定进程的优先值
    renice -u -g - 通过指定用户和组来改变进程优先值

  5. kill :用来发送信号给进程,并结束进程。如果一个进程没有响应杀死命令,这也许就需要强制杀死,使用 -9 参数来执行。

  kill <pid>                  --- 使用 kill 时候,需要知道进程ID号,可以通过 ps 命令得到 进程号
  kill -9 <pid>              --- 杀死进程
  killall -9 <进程名>    --- 杀死所有拥有同样名字的进程
  pkill <进程名>          --- pkill 是类似的命令,但使用模式匹配,如进程名,进程拥有者等。
  1. ulimit :控制系统资源在shell和进程上的分配量。对于系统管理员是最有用的,可以管理重度使用和存在性能问题的系统。限制资源大小可以确保重要进程持续运行,其他进程不会占用过多资源。
    -f - 最大文件尺寸大小
    -v - 最大虚拟内存大小(KB)
    -n - 增加最大文件描述符数量
    -H : 改变和报告硬限制
    -S : 改变和报告软限制
    ulimit -a - 显示当前用户关联的资源限制

  2. w :显示当前登录的用户及其正在执行的进程的信息。
    显示信息头包含信息,如当前时间、系统运行时长、登录用户总数、过去的1,5,15分钟内的负载均衡数。基于这些用户信息,用户在终止不属于他们的进程时要小心。

  3. who: 和 w 类似的命令,提供当前登录用户列表、系统启动时间、运行级别等。

  4. whoami : 输出当前用户ID。

  5. fg 、bg:fg 即 frontgroud,表示 前台。 bg 即 background,表示 后台。
    使用 “bg” 命令可以将任务放在后台执行。使用 “fg” 命令可以将任务调到前台执行。
    可以通过 & 在后台启动一个程序: find . -name *iso > /tmp/res.txt &
    一个正在运行的程序也可以通过 “CTRL+Z” 和 “bg” 命令组合放到后台运行。
    find . -name *iso > /tmp/res.txt & // 启动一个程序
    ctrl+z // 挂起当前执行程序
    bg // 将程序放到后台运行

  6. jobs :列出所有后台进程。

  7. ipcs :ipcs 命令报告进程间通信设施状态。(共享内存,信号量和消息队列)
    用 -p 参数联合 -m、-s 或 -q 使用,可以获得相关的进程间通信的进程ID。
    示例:ipcs -p -m

5 种进程状态

ps 工具标识进程的 5 种状态码:

R运行状态(runing): 表明进程要么在运行中要么在运行队列里,并不意味着进程一定在运行中。

S睡眠状态(sleeping):意味着进程在等待事件的完成(这里的睡眠有时候也叫做可中断睡眠)

D磁盘睡眠状态(Disk sleep): 有时候也叫做不可中断睡眠,在这个状态的进程通常会等待IO的结束

T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的进程可以通过发送SIGCNT信号让进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

Z(zombie)-僵尸进程 :下面会详细介绍

  • 1.僵尸状态是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程
  • 2.僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码
  • 3.所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程的状态,子进程就进去僵尸状态

ps aux 列出目前所有的正在内存当中的程序

输出格式 :

  • USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER:     进程所有者
PID:      进程ID
%CPU:     占用的 CPU 使用率
%MEM:     占用的内存使用率
VSZ:      占用的虚拟内存大小
RSS:      占用的内存大小
TTY:      终端的次要装置号码 (minor device number of tty)
STAT:     进程状态:
START:    启动进程的时间; 
TIME:     进程消耗CPU的时间;
COMMAND:  命令的名称和参数;
ps -ef               	显示所有进程信息,连同命令行
ps -ef | grep ssh    ps 与grep 常用组合用法,查找特定进程

僵尸进程是怎么产生的

首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间。

所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。一个进程执行了exit系统调用退出,其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态),另外子进程退出的时候会向其父进程发送SIGCHLD信号,父进程默认忽略SIGCHLD信号不进行处理,那么子进程将一直保持在僵尸状态,如果这时父进程结束了,init进程自动接收这个子进程,但如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态。

在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但是仍然保留了一些信息(如进程号pid 退出状态 运行时间等)。如果没有调用wait/waitpid的话,那么保留的信息就不会释放。比如进程号就会被一直占用了。但系统所能使用的进程号的有限的,如果产生大量的僵尸进程,将导致系统没有可用的进程号而导致系统不能创建进程。

SIGCHLD信号产生的条件
1.子进程终止时会向父进程发送SIGCHLD信号,告知父进程回收自己,但该信号的默认处理动作为忽略,因此父进程仍然不会去回收子进程,需要捕捉处理实现子进程的回收;
2.子进程接收到SIGSTOP(19)信号停止时;
3.子进程处在停止态,接受到SIGCONT后唤醒时。

僵尸进程的危害:

1.进程的退出状态必须被维持下去,因为他要关心他的进程(父进程),父进程如果一直不读取,那子进程一直处于Z状态

2.维护退出状态本身就是要用数据维护,也属于进程的基本信息,所以保存在task_struct中,换句话说,Z状态一直不退出,PCB就要一直维护

3.父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费,因为数据结构对象本身就要占用内存。

4.内存泄露

僵尸进程的避免

【Linux系列】再谈僵尸进程的产生与避免_第1张图片
【Linux系列】再谈僵尸进程的产生与避免_第2张图片
【Linux系列】再谈僵尸进程的产生与避免_第3张图片
【Linux系列】再谈僵尸进程的产生与避免_第4张图片

你可能感兴趣的:(操作系统,linux)