Linux进程管理命令及状态详解

2020-09-22 10:59:47 浏览数 (1)

1. 常用的进程管理命令

1.1 ps

查看某个时间点的进程信息。

代码语言:javascript复制
# 列出所有运行中/激活进程
ps -a
# 查看自己的进程
ps -l
# 查看系统所有进程
ps aux
# 查看特定的进程
ps aux | grep threadx

1.2 pstree

查看进程树。 linux中,每一个进程都是由其父进程创建的。此命令以可视化方式显示进程,通过显示进程的树状图来展示进程间关系。如果指定了pid了,那么树的根是该pid,不然将会是init(pid: 1)。

代码语言:javascript复制
#查看所有进程树
pstree

1.3 top

实时显示进程信息。 top 是一个更加有用的命令,可以监视系统中不同的进程所使用的资源。它提供实时的系统状态信息。显示进程的数据包括PID、进程属主、优先级、%CPU、%memory等。可以使用这些显示指示出资源使用量。

代码语言:javascript复制
# 示例:两秒钟刷新一次
top -d 2

可以按上下键浏览,按 q 退出。


代码语言:javascript复制
# 交互式的文本模式的进程查看器
htop

htop与top很类似,但是htop是交互式的文本模式的进程查看器。它通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。Htop不是系统默认安装的,所以需要额外安装。

安装方法(我这里是 centos7)

代码语言:javascript复制
一、以yum方式安装

1、yum -y install epel-release.noarch

2、yum -y install htop

二、源码方式安装

1、安装gcc、内核库依赖库

yum install -y gcc ncurses-deve

2、下载源码

wget http://sourceforge.net/projects/htop/files/latest/download

3、解压并进入htop-1.0.2目录

tar -zxf download

cd htop-1.0.2

4、编译安装(执行./configure如果执行报错 configure: error: You may want to use --disable-unicode or install libncursesw,表明缺少lib 包,安装lib包:yum install ncurses-devel -y)

./configure && make && make install

5、验证

htop

1.4 netstat

查看占用端口的进程

代码语言:javascript复制
# 示例:查看特定端口的进程
netstat -anp | grep port

1.5 nice

通过nice命令的帮助,用户可以设置和改变进程的优先级。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。默认情况下,进程以0的优先级启动。进程优先级可以通过top命令显示的NI(nice value)列查看。

进程优先级值的范围从-20到19。值越低,优先级越高。

nice <优先值> <进程名> :通过给定的优先值启动一个程序

示例:nice --3 top 回车可以看到 top 命令获得了-3的优先值。

renice 命令类似 nice 命令。使用这个命令可以改变正在运行的进程优先值。注意,用户只能改变属于他们自己的进程的优先值。

renice -n -p - 改变指定进程的优先值

示例:renice -n 4 -p 1950

初始优先值为0的1950号进程优先值已经变成了4。

renice -u -g - 通过指定用户和组来改变进程优先值

示例:renice -3 -u lft

用户为 ‘lft’ 的所有进程优先值变为 ‘-3’。

1.6 kill

这个命令用于发送信号来结束进程。如果一个进程没有响应杀死命令,这也许就需要强制杀死,使用 -9 参数来执行。注意,使用强制杀死的时候一定要小心,因为进程没有时机清理现场,也许写入文件没有完成。如果我们不知道进程 PID 或者打算用名字杀死进程时候,killall就能派上用场。

kill <pid> kill -9 <pid> killall -9 杀死所有拥有同样名字的进程 如果你使用 kill,你需要知道进程 ID 号。pkill 是类似的命令,但使用模式匹配,如进程名,进程拥有者等。

pkill <进程名>

2. 进程状态

2.1 SIGCHLD

当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:

得到 SIGCHLD 信号; waitpid() 或者 wait() 调用会返回。 其中子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程 ID、进程状态、进程使用 CPU 的时间等。

在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。

2.2 wait()

pid_t wait(int *status) Copy to clipboardErrorCopied 父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。

如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。

参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL。

2.3 waitpid()

pid_t waitpid(pid_t pid, int *status, int options) Copy to clipboardErrorCopied 作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。

pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。

options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。

2.4 孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。

孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。

由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。

2.5 僵尸进程

一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。

系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。

要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。

本文参考资料: https://www.cnblogs.com/wangguod/p/9895011.html http://liubigbin.github.io/2016/03/11/Linux-之守护进程、僵死进程与孤儿进程/ https://idea.popcount.org/2012-12-11-linux-process-states/ https://www.linuxprobe.com/12linux-process-commands.html

0 人点赞