在日常工作中,有时需要了解系统的运行状况,这里就涉及到系统的进程管理。
linux下的系统监控不像windows系统一样,可以直接通过任务管理器界面即可查看到各种信息,但我们可以通过各种命令来监控查看各种信息。
我们通过一定的命令可以达到进程的管理:
- 查看系统中运行的程序和进程
- 判断服务器的健康状态
- 停止不需要的进程
这里涉及到监控有CPU
,内存
,磁盘
,进程
等。
1.CPU的使用-top命令
作用:查看服务器的进程占用的资源
语法:# top (动态显示)
交换操作快捷键:
M(大写):表示将结果按照内存(MEM)从高到低进行降序排列;
P(大写):,表示将结果按照CPU 使用率从高到低进行降序排列;
1 :当服务器拥有多个cpu 的时候可以使用“1”快捷键来切换是否展示显示各个cpu 的详细信息;
q:退出
2.内存使用查看-free命令
作用:查看内存使用情况
语法:#free -m,一般可以free -h,已合适单位显示
第1行Mem数据:
total 内存总数: 1819
used 已经使用的内存数: 774
free 空闲的内存数: 152
shared 共享内存数: 77
buff/Cache块设备缓存区内存数: 892
available可用内存: 746
第2行数据是Swap交换分区,也就是我们通常所说的虚拟内存。可以在内存不够使用的情况下当临时内存来使用,交换分区并不是越大越好,一般话它就等同于实际内存的大小。
3.查看磁盘信息-df命令
作用:查看磁盘的空间(disk free)
语法:# df [-h]
Filesystem | 磁盘名称 |
---|---|
Size | 总大小 |
Used | 被使用的大小 |
Avail | 剩余大小 |
Use% | 使用百分比 |
Mounted on | 挂载路径(相当于Windows 的磁盘符) |
4.进程信息-ps命令
作用:主要是查看服务器的进程信息
选项含义:
-e:等价于“-A”,表示列出全部(all)的进程
-f : 表示full,显示全部的列(显示全字段)
通常我们会配合管道及 grep
命令来过滤查看特定进程信息。
tips
ps aux
BSD格式命令,注意没有横杠"-"
Unix有很多分支,目前主流的显示风格分为System V和BSD,使用ps -ef
属于system V风格,ps aux
是BSD风格,可以理解为两种风格只是显示不同。
USER:该 process 属于哪个使用者账号
PID :该 process 的ID
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令
命令参数:
a 显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
c 显示进程的真实名称
-N 反向选择
-e 等于“-A”
e 显示环境变量
f 显示程序间的关系
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
-C<命令> 列出指定命令的状况
--lines<行数> 每页显示的行数
--width<字符数> 每页显示的字符数
--help 显示帮助信息
--version 显示版本显示
使用实例:
实例1:显示所有进程信息
ps -A
实例2:显示指定用户信息
ps -u root
实例3:显示所有进程信息,连同命令行
ps -ef
例4: ps 与grep 常用组合用法,查找特定进程
ps -ef|grep ssh
实例5:将目前属于您自己这次登入的 PID 与相关信息列示出来
ps -l
实例6:列出目前所有的正在内存当中的程序
ps aux
5.进程的网络访问-netstat
作用:查看网络连接状态
语法:# netstat -tnlp
选项: -t:表示只列出tcp 协议的连接;
-n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示;
-l :表示过滤出"state(状态)"列中其值为LISTEN(监听)的连接;
-p:表示显示发起连接的进程pid 和进程名称;
-a:列出所有
-u: udp
Protocol:协议(tcp、upd、http、https、icmp、ssh…)
Receive:接收
Send:发送
Local Address:本地地址
Foreign:远程地址
State:状态,LISTEN表示侦听来自远方的TCP端口的连接请求
PID/Program name:进程ID和程序名
6.关闭进程-kill & killall & pkill
kill
语法:kill [信号] PID
参数:
-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 指定发送信号
-u 指定用户
作用:kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。
tips:
9-杀死进程,即强制结束进程,15-正常结束进程,是 kill 命令的默认信号
通常我们会先用 ps
命令及管道 grep操作获取到 pid
信息。
killall
作用:通过程序的进程名来杀死一类进程
Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。
语法:# killall [信号] 进程名称
命令参数:
-Z 只杀死拥有scontext 的进程
-e 要求匹配进程名称
-I 忽略小写
-g 杀死进程组而不是进程
-i 交互模式,杀死进程前先询问用户
-l 列出所有的已知信号名称
-q 不输出警告信息
-s 发送指定的信号
-v 报告信号是否成功发送
-w 等待进程死亡
--help 显示帮助信息
--version 显示版本显示
pkill
控制同名程序的所有进程,类似killall
参数:
-G:仅匹配真实组ID在给定列表中的进程。
-P ppidlist: 仅匹配给定列表中PPID的进程。
-t termlist:仅匹配与给定列表中终端关联的进程。
-U uidlist:仅匹配真实的用户ID在给定列表中的进程。
-u euidlist:仅匹配有效用户ID在给定列表中的进程
-signal:指定发往每一个匹配进程的信
-x:仅认为进程其参数字符串或者执行文件名称正确匹配规定模式是匹配的进程。
举例:
# 杀掉uwsgi进程
pkill uwsgi
kill & kill -9 & kill -15
执行kill(不加 -* 默认kill -15)命令,系统会发送一个SIGTERM信号给对应的程序。当程序接收到该signal信号后,将会发生以下事情:
1.程序立刻停止
2.当程序释放相应资源后再停止
3.程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应),也就是说,SIGTERM多半是会被阻塞的。
然而kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。
总之:在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。