文章概要
本文主要介绍了Linux 系统管理的目的,还有常见系统信息查看的命令,ps 、pstree和top命令,还介绍了如何杀死异常进程,其方式有杀死单个进程、杀死一组进程、以及如何将用户踢出终端(杀掉终端),文末还介绍了进程优先级的概念和修改进程优先级的两个命令 nice 和 renice。
一、简介
进程是正在执行的一个程序或命令,每一个进程都有自己的地址空间,并占用一定的系统资源。而操作系统为我们提供各种各样的服务,自然后台就会有许多进程在运行。有时候我们也会运行自己所写的程序。操作系统是通过进程控制块来管理进程的,那么我们用户该如何来管理这些进程呢?这就是进程管理要做的事情。
二、 进程管理的作用
- 判断服务器的状态是否正常运行(比如查看内存和CPU情况,看服务器是否负载过重)
- 查看系统中的进程信息(比如查看进程是否在运行以及某项服务是否已启动或占用很多资源)
- 杀死进程(杀死一些失去控制的进程)
三、进程查看 ps 命令和 pstree 命令
ps 命令
1. ps 命令简介与常用选项
ps - report a snapshot of the current processes.
报告当前进程信息的快照,主要用来查看进程信息。
[Jack@ www ~]$ ps aux
# 查看系统中所有进程,BSD操作系统分格
[Jack@ www ~]$ ps -le
#查看系统中所有进程,使用Linux标准命令格式
选项说明:
- a:显示一个终端的所有进程,除了会话首进程和与终端无关联的进程
- u:显示进程的所属用户及内存的使用情况
- x:显示没有控制终端的进程
- -l:长格式显示。显示更详细的信息
- -e:显示所有进程与 -A一致
2. ps 命令输出信息说明
- USER :该进程由那个用户产生的
- PID:该进程的进程号
- %CPU:该进程占用的CPU 资源百分比,越高表示越耗费资源
- %MEM:该进程占用物理内存的百分比,越高表示越耗费资源
- VSZ:该进程占用虚拟内存的大小,单位KB
RSS:该进程占用实际物理内存的大小,单位KB
TTY:该进程是在哪个终端中运行的。tty1-tty7 是本地控制终端,其中tty-tty6是本地的字符界面终端,tty7是图像终端。pts/0-255代表虚拟终端(远程登录的)(内核2.6以后可以达到65535个)。问号表示该进程不受终端控制。
STAT:进程状态。常见状态:
- R:运行
- S:睡眠
- T:停止状态
- Z:僵尸进程
- s:包含子进程
- +:位于后台的进程组
其余状态: - D:无法中断的休眠状态(I/O进程)
- <:优先级高的进程
- l:多进程的
- START:该进程的启动时间
- TIME:进程占用CPU的运算时间
- COMMAND:产生此进程的命令名
pstree 命令
pstree - display a tree of processes
# 显示进程树
选项:
- -p:显示进程的PID
- -u:显示进程所属用户
示例:
[Jack@www ~]$ pstree
init─┬─NetworkManager─┬─dhclient
│ └─{NetworkManager}
├─VGAuthService
├─abrtd
├─acpid
├─atd
├─auditd───{auditd}
├─console-kit-dae───63*[{console-kit-da}]
├─crond
├─cupsd
├─dbus-daemon───{dbus-daemon}
├─hald─┬─hald-runner─┬─hald-addon-acpi
│ │ └─hald-addon-inpu
│ └─{hald}
├─httpd───8*[httpd]
├─login───bash
├─master─┬─pickup
│ └─qmgr
├─5*[mingetty]
├─modem-manager
├─mysqld_safe───mysqld───9*[{mysqld}]
├─rsyslogd───3*[{rsyslogd}]
├─sshd─┬─sshd───sshd───bash
│ └─sshd───sshd───bash───pstree
├─udevd───2*[udevd]
├─vmtoolsd───{vmtoolsd}
├─vmware-vmblock-───2*[{vmware-vmblock}]
└─wpa_supplicant
四、进程查看 top 命令
1. 简介
top - display Linux tasks
#显示系统任务,类似Windows 中的任务管理器,判断服务器的状态是否正常运行
演示:
2. 选项及命令
在命令行执行时的选项:
- -d 秒数:指定 top命令刷新间隔,默认是3秒,如输入 top -d 1 表示每隔一秒刷新一次
- -b:使用批处理模式输出。默认是动态更新,指定此选出后会一屏一屏连续打印。
- -n:指定top命令的执行次数。一般与-b选项合用。如输入 top -b -n 3 ,将会执行三次top 命令。
在没有指定-b选项时,top命令将动态更新,在此模式下有如下交互命令:
- ?或h:显示帮助信息,按任意键返回
- P:以CPU使用率排序,默认就是该选项
- M:以内存使用率排序
- N:以PID排序
- q:退出top
3. top命令上半部分显示的信息分析
一共有五行信息,分别表示:
第一行信息为任务队列信息:
内容 | 说明 |
---|---|
20:34:50 | 当前系统时间 |
up 1:33 | 系统从开机到现在的运行时间,本机已运行1小时33分钟 |
3 users | 当前登录的用户数 |
load average: 0.00, 0.00, 0.00 | 分别表示系统在1分钟之前,5分钟之前,15分钟之前的平均负载。平均负载指CPU和内存占比的平均值 |
第二行为进程信息:
内容 | 说明 |
---|---|
102 total | 系统总的进程总数 |
1 running | 正在运的进程数 |
101 sleeping | 睡眠的进程数 |
0 stopped | 被停止的进程 |
0 zomble | 僵尸进程数。父进程没有退出并且没有回收已经退出子进程的资源,子进程就会成为僵尸进程 |
第三行为CPU信息:
内容 | 说明 |
---|---|
o.3%us | 用户模式占用的 CPU 百分比 |
0.3%sy | 系统模式占用的 CPU 百分比 |
0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比。ni 表示nice 值, 使用命令 ps -le 可以看到进程的优先级,负值表示优先级高,正值表示低优先级 |
99.3%id | 空闲 CPU 的百分比 id表示单词 idle的缩写 |
0.0%wa | 等待输入/输出的进程占用 CPU 百分比。wa 即wait |
下面的几项不是很常用 | |
0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
0.0%si | 软终端请求服务占用的 CPU 百分比 |
0.0%st | st(steal time)虚拟世界百分比。当有虚拟机时,虚拟CPU等待世界 CPU 的时间百分比 |
第四行为物理内存信息:
内容 | 说明 |
---|---|
1030528k total | 物理内存的总量单位 KB |
220676k used | 已经使用的物理内存 |
809852k free | 空闲的物理内存数量 |
47464k buffers | 作为缓存区的内存大小,主要用来加速数据写入 |
第五行为交换分区(swap)信息:
内容 | 说明 |
---|---|
2064376k total | 交换分区(虚拟内存)的总大小 |
0k used | 已经使用的交换分区大小 |
2064376k free | 空闲交换分区大小 |
83820k cached | 作为缓存的交换分区大小,主要用来加速数据读取 |
五、杀死进程(kill,killall,pkill)
在杀死进程之前,一定要记得,你不是一个“杀手”,不能逮谁杀谁,进程大都有自己的退出方式,只有在失去控制或者无法正常终止进程的时候,才采取此终极手段,此时像一个杀手一样为“操作系统”除害。在Liuux中对进程的控制,是基于信号来实现的,可以使用kill -l
来列出系统中的信号列表:
下面列出一些常见的与进程“性命攸关”的信号:
信号代码 | 信号名称 | 说明 |
---|---|---|
1 | SIGHUB | 让进程立即关闭,然后重新读取配置文件之后重启,也可以叫平滑启动。比如修改Apache 的配置文件后,想让其生效,又不想让当前用户掉线,就可以发送该信号。 |
2 | SIGINT | 用于终止前台进程。相当于ctrl + c |
8 | SIGFPE | 在发发生指明的算术错误时发出,如浮点数运算错误,溢出以及除数为0 |
9 | SIGKILL | 立即终止进程,该信号不能被阻塞、捕捉和忽略 |
14 | SIGALRM | 时钟定时信号,计算的是时钟实际,函数alarm使用 |
15 | SIGTERM | 正常结束进程的信号,kill命令的默认信号。当进程退出出现异常时,这个信号无法终止,需要SIGKILL |
18 | SIGCONT | 让暂停的进程恢复执行,不能被阻断 |
19 | SIGSTOP | 暂停前台进程,相当于ctrl+z,信号不能被阻断 |
注:如果想深入一些了解信号可阅读:【Linux】信号的理解以及信号集处理函数的使用
kill命令 :用来杀死单一进程
[Jack@www ~]$ kill -9z 3487
[Jack@www ~]$ kill -SIGKILL 3478
//都表示杀死 PID 为3478 的进程,可将-9和SIGKILL 换为其余信号
killall命令:用来杀死一组进程
[Jack@www ~]$ killall -9 httpd
# 表示杀死名为httpd的所有进程
killall [选项][信号] 进程名
#按·`照进程名字杀死进程
#选项:
# -i :交互式,询问是否要杀死
# -I :忽略进程名的大小写
pkill 命令:可用来杀死进程或者强制将某个用户踢出系统
[Jack@www ~]$ pkill -9 -t pts/0
# 表示将重点pts/0 上的用户踢出
# -t 表示按照终端号踢出用户
# 可使用w命令查看当前系统中用户和终端
[Jack@www ~]$ w
23:23:34 up 4:11, 4 users, load average: 0.03, 0.03, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 19:10 3:29m 0.18s 0.18s -bash
huozhiga pts/0 192.168.43.157 22:44 38:55 0.01s 0.01s -bash
Jack pts/1 192.168.43.157 19:17 9:54 0.44s 0.44s -bash
Jack pts/2 192.168.43.157 21:11 0.00s 0.37s 0.00s w
[Jack@www ~]$ who am i # 使用 who am i 命令 查看自己所在终端
Jack pts/2 2017-07-07 21:11 (192.168.43.157)
[Jack@www ~]$
六、修改进程优先级
进程优先级简述
由于 Linux是多用户多任务的操作系统,每时每刻都运行着众多的系统,而cpu 核心数是少数的,那么操作系统在分配CPU资源给进程时,就要考虑应该先分配给谁,以及分配的顺序,也就是我们常说的进程的调度,确保一些重要的进程可以第一时间得到响应。
查看进程的优先级信息:
PRI 代表 Priority, NI 代表 Nice,都表示优先级,数值越小,优先级越高,还有以下需要注意的地方:
- 用户不能直接修改 Priority 值,只能修改 NI 值,优先级最终值是 PRI 和 NI 的和。
- PRI(最终结果) = PRI(原来值) + NI
- NI 的范围是 [-20 到 19]
- 普通用户调整 NI 值的范围被限制到 [0 到 19],且只能调整属于自己的进程的 NI 值
- root 可以设值 NI 为负值,还可以调整任意用户的 NI 值
优先级的修改方式:
通过 nice 命令:
使用命令之前需要知道:nice命令可以给新执行的程序 赋予NI 值,不能修改已经执行进程的NI 值。
#例如需要将程序 a.out 的优先级从默认PRI 值 为80执行改为85执行
[Jack@www code]$ nice -n 5 ./a.out
[Jack@www ~]$ ps -el | grep -E 'PID | a.out'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 502 4013 2448 98 85 5 - 466 - pts/1 00:02:36 ./a.out
# 可以看到此时已经是85
那么如何修改已经在运行进程的有效级呢?
renice 命令:修改已经运行进程的NI值
注意:改renice命令修改时,是基于默认值80 来做运算的。
# 比如要将刚才运行的 a.out 优先级从85 修改为 81,可用下面的命令
[root@www Jack]# renice 1 4013
4013: old priority 5, new priority 1
[root@www Jack]# ps -el | grep -E 'PID | zombie'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 502 4013 2448 99 81 1 - 466 - pts/1 00:13:00 zombie
# 可以看到此时并不是直接在 85 的基础上加1,而是在80 的基础上加1
优先级一般不需要修改,因为系统比我们更清楚应该如何调度进程。