1、概述
无论是 Linux 系统管理员还是普通用户,监视系统进程的运行情况并适时终止一些失控的进程,是每天的例行事务。和 Linux 系统相比,进程管理在 Windows 中更加直观,它主要是使用"任务管理器"来进行进程管理的。
通常,使用"任务管理器"主要有 3 个目的:
利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程;
利用"性能"和"用户"标签来判断服务器的健康状态;
在"应用程序"和"进程"标签中强制中止任务和进程;
2、进程管理的作用
-
判断服务器的健康状况
进程管理最主要的工作就是判断服务器当前运行是否健康,是否需要人为干预。如果服务器的 CPU 占用率、内存占用率过高,就需要人为介入解决问题了。这又出现了一个问题,我们发现服务器的 CPU 或内存占用率很高,该如何介入呢?是直接终止高负载的进程吗?
当然不是,应该判断这个进程是否是正常进程,如果是正常进程,则说明你的服务器已经不能满足应用需求,你需要更好的硬件或搭建集群了;如果是非法进程占用了系统资源,则更不能直接中止进程,而要判断非法进程的来源、作用和所在位置,从而把它彻底清除。当然,如果服务器数量很少,我们完全可以人为通过进程管理命令来进行监控与干预,但如果服务器数量较多,那么人为手工监控就变得非常困难了,这时我们就需要相应的监控服务,如
cacti
或nagios
。 -
查看系统中的所有进程
我们需要查看看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务、是否有非法服务在运行。
-
杀死进程
这是进程管理中最不常用的手段。当需要停止服务时,会通过正确关闭命令来停止服务(如 apache 服务可以通过
service httpd stop
命令来关闭)。只有在正确终止进程的手段失效的情况下,才会考虑使用kill
命令杀死进程。
3、进程的启动方式
-
手工启动
手工启动进程指的是由用户输入命令直接启动一个进程,根据所启动的进程类型和性质的不同,其又可以细分为前台启动和后台启动 2 种方式。
-
前台启动进程
这是手工启动进程最常用的方式,因为当用户输入一个命令并运行,就已经启动了一个进程,而且是一个前台的进程,此时系统其实已经处于一个多进程的状态(实际上,系统自动时就有许多进程悄悄地在后台运行)
-
后台启动进程
进程直接从后台运行,用的相对较少,除非该进程非常耗时,且用户也不急着需要其运行结果的时候,例如,用户需要启动一个需要长时间运行的格式化文本文件的进程,为了不使整个 Shell 在格式化过程中都处于“被占用”状态,从后台启动这个进程是比较明智的选择。
从后台启动进程,其实就是在命令结尾处添加一个
&
符号(注意,&
前面有空格)。输入命令并运行之后,Shell 会提供给我们一个数字,此数字就是该进程的进程号。然后直接就会出现提示符,用户就可以继续完成其他工作
-
-
调度启动
在 Linux 系统中,任务可以被配置在指定的时间、日期或者系统平均负载量低于指定值时自动启动。例如,Linux 预配置了重要系统任务的运行,以便可以使系统能够实时被更新,系统管理员也可以使用自动化的任务来定期对重要数据进行备份。
实现调度启动进程的方法有很多,例如通过
crontab、at
等命令
4、进程相关的命令
-
查看正在运行的进程
通过
ps
命令可以查看系统中所有运行进程的详细信息。该命令的基本格式:
[root@localhost ~] # ps [选项]
常用选项:
选项 含义 a 显示一个终端的所有进程,除会话引线外; u 显示进程的归属用户及内存的使用情况; x 显示没有控制终端的进程(后台进程); -l 长格式显示更加详细的信息; -e 显示所有进程; -f 完整的(Full)格式显示进程信息。 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,记忆几个固定选项即可。比如:
-
“
ps aux
” 可以查看系统中所有的进程;以上输出信息中各列的具体含义:
表头 含义 USER 该进程是由哪个用户产生的。 PID 进程的 ID。 %CPU 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 %MEM 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 VSZ 该进程占用虚拟内存的大小,单位为 KB。 RSS 该进程占用实际物理内存的大小,单位为 KB。 TTY 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。 STAT 进程状态。常见的状态有以下几种:
-D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从 2.6 内核开始无效)。
-X:死掉的进程(应该不会出现)。
-Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
-<:高优先级(以下状态在 BSD 格式中出现)。
-N:低优先级。
-L:被锁入内存。
-s:包含子进程。
-l:多线程(小写 L)。
-+:位于后台。START 该进程的启动时间。 TIME 该进程占用 CPU 的运算时间,注意不是系统时间。 COMMAND 产生此进程的命令名。 -
“
ps -le
” 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;ps aux
命令可以看到系统中所有的进程,ps -le
命令也能看到系统中所有的进程。由于 “-l” 选项的作用,所以 “ps -le
” 命令能够看到更加详细的信息,比如父进程的 PID、优先级等以上输出的信息中各列的具体含义:
表头 含义 F 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行; 4:进程使用超级用户权限; S 进程状态。具体的状态和"ps aux"命令中的 STAT 状态一致; UID 运行此进程的用户的 ID; PID 进程的 ID; PPID 父进程的 ID; C 该进程的 CPU 使用率,单位是百分比; PRI 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行; NI 进程的优先级,数值越小,该进程越早被执行; ADDR 该进程在内存的哪个位置; SZ 该进程占用多大内存; WCHAN 该进程是否运行。"-"代表正在运行; TTY 该进程由哪个终端产生; TIME 该进程占用 CPU 的运算时间,注意不是系统时间; CMD 产生此进程的命令名; -
“
ps -l
” 只能看到当前 Shell 产生的进程;
僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中,这就是僵尸进程。
-
-
监听进程运行状态
ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性。为此,Linux 提供了
top
命令。top
命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。top 命令的基本格式如下:
[root@localhost ~]#top [选项]
选项:
选项 含义 -d 秒数 指定 top 命令每隔几秒更新。默认是 3 秒; -b 使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中; -n 次数 指定 top 命令执行的次数; -p 进程PID 仅查看指定 ID 的进程; -s 使 top 命令在安全模式中运行,避免在交互模式中出现错误; -u 用户名 只监听某个用户的进程; 在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
- ? 或 h:显示交互模式的帮助;
- P:按照 CPU 的使用率排序,默认就是此选项;
- M:按照内存的使用率排序;
- N:按照 PID 排序;
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
- r:按照 PID 给某个进程重设优先级(Nice)值;
- q:退出 top 命令;
对输出的信息进行解释一下。top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
- 第二部分从第六行开始,显示的是系统中进程的信息;
-
第一行为任务队列信息,具体内容如下表所示。
内 容 说 明 19:36:44 系统当前时间 7:05 系统的运行时间.本机己经运行 7 小时 05 分钟 2 users 当前登录了两个用户 load average: 0.00,0.01,0.05 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) -
第二行为进程信息,具体内容如表 2 所示。
内 容 说 明 Tasks: 96 total 系统中的进程总数 1 running 正在运行的进程数 95 sleeping 睡眠的进程数 0 stopped 正在停止的进程数 0 zombie 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 -
第三行为 CPU 信息,具体内容如表 3 所示。
内 容 说 明 Cpu(s): 0.0 %us 用户模式占用的 CPU 百分比 0.0%sy 系统模式占用的 CPU 百分比 0.0%ni 改变过优先级的用户进程占用的 CPU 百分比 100%id 空闲 CPU 占用的 CPU 百分比 0.0%wa 等待输入/输出的进程占用的 CPU 百分比 0.0%hi 硬中断请求服务占用的 CPU 百分比 0.0%si 软中断请求服务占用的 CPU 百分比 0.0%st st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 -
第四行为物理内存信息,具体内容如表 4 所示。
内 容 说 明 Mem: 995896 total 物理内存的总量,单位为KB 122764 used 己经使用的物理内存数量 394576 free 空闲的物理内存数量 478556 buff/cache 作为缓冲的内存数量 -
第五行为交换分区(swap)信息,如表 5 所示。
内 容 说 明 Swap: 2097148 total 交换分区(虚拟内存)的总大小 0 used 已经使用的交换分区的大小 2097148 free 空闲交换分区的大小 679448 cached 作为缓存的交换分区的大小
-
终止进程
使用
kill
命令来终止进程基本格式如下:
[root@localhost ~]# kill [信号] PID
kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名
常用信号:
信号编号 信号名 含义 0 EXIT 程序退出时收到该信息。 2 INT 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。 3 QUIT 退出。 9 KILL 杀死进程,即强制结束进程。 15 TERM 正常结束进程,是 kill 命令的默认信号。 也可以使用
killall
关闭进程,但和 kill 不同的是,killall
命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程基本格式如下:
[root@localhost ~]# killall [选项] [信号] 进程名 [root@localhost ~]# killall httpd #杀死所有进程名是httpd的进程
-
查看后台进程
jobs
命令可以用来查看当前终端放入后台的工作基本格式如下:
[root@localhost ~]#jobs [选项]
常见选项:
选项 含义 -l(L 的小写) 列出进程的 PID 号。 -n 只列出上次发出通知后改变了状态的进程。 -p 只列出进程的 PID 号。 -r 只列出运行中的进程。 -s 只列出已停止的进程。 当前终端有一个后台工作, top 命令,工作号为 1,状态是暂停,标志是"+“;”+“号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。”-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"±"标志了。
-
查看内存使用状态
free
命令用来显示系统内存状态,包括系统物理内存、虚拟内存(swap 交换分区)、共享内存和系统缓存的使用情况基本格式如下:
[root@localhost ~]# free [选项]
选项:
选项 含义 -b 以 Byte(字节)为单位,显示内存使用情况。 -k 以 KB 为单位,显示内存使用情况,此选项是 free 命令的默认选项。 -m 以 MB 为单位,显示内存使用情况。 -g 以 GB 为单位,显示内存使用情况。 -
查看过去登录的用户信息
last
命令可以查看当前和过去登陆系统用户的相关信息;lastlog
命令可以查看到每个系统用户最近一次登陆系统的时间。last 命令的基本格式:
[root@localhost ~]# last [选项]
选项:
选项 含义 -a 把从何处登陆系统的主机名或 IP 地址显示在最后一行。 -R 不显示登陆系统的主机名或 IP 地址。 -x 显示系统关机、重新开机以及执行等级的改变等信息。 -n 显示列数 设置列出信息的显示列数。 -d 将显示的 IP 地址转换成主机名称。 在执行 last 命令时,它默认会读取
/var/log/wtmp
日志文件,这是一个二进制文件,不能直接用 vi 编辑,只能通过 last 命令调用。lastlog 命令默认是去读取
/var/log/lastlog
日志文件的