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等。可以使用这些显示指示出资源使用量。
# 示例:两秒钟刷新一次
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