来深入学习一下进程
进程管理
进程简介
什么是进程
进程是正在执行的一个程序或命令, 每一个进程多事一个运行的实体, 并且都有自己的地址空间, 并占用一定的系统资源.
那么什么是程序呢? 程序是人使用计算机语言编写的可以实现特定目标或者解决特定问题的代码集合.
进程管理的作用
判断服务器健康状态: 运维工程师最主要的工作就是保证服务器安全稳定的运行。理想的状态是, 在服务器出现问题, 但是还没有造成服务器宕机或停止服务时, 就人为干预解决了问题。 进程管理最主要的工作就是判断服务器当前运行是否健康, 是否需要人为干预。 如果服务器的CPU占用率, 内存占用率过高, 就需要人为介入解决问题了。(内存 70, cpu 90 ,超过这个比例就是服务器不健康)
查看系统中所有的进程: 我们需要查看系统中所有正在运行的进程, 通过这些进程可以判断系统中运行了哪些服务, 是否有非法服务运行.
杀死进程: 这是进程管理中最不常用的手段, 当我需要停止服务时, 会通过正确关闭命令来停止服务(如 apache 服务可以通过 service httpd stop 来关闭). 只有当正确终止进程的手段失效的情况下,才会考虑使用kill 杀死进程.
进程的查看
ps 命令
ps 命令是用来静态显示系统中进程的命令.
不过这个命令有些特殊,它的部分命令选项是不能加"-"的, 比如命令 "ps aux", 其中 "aux "是 选项, 但是这个命令是不能加入"-" 的,这是因为ps命令的部分选项是需要遵守BSD操作系统的格式。
ps aux
#查看系统中所有进程, 使用BSD 操作系统格式
ps -le
# 查看系统中所有进程, 使用linux 标准命令格式
选项:
a : 显示一个终端的所有进程,除了会话引线
u : 显示进程的归属用户以及内存的使用情况
x : 显示没有控制终端的进程
-l : 长格显示. 显示更加详细的信息
-e : 显示所有的进程,和 a 作用一致
top命令和pstree命令
top 命令
top [选项]
选项:
-d 秒数: 指定top命令每隔几秒更新,默认是三秒
-b : 使用批处理模式输出. 一般和 "-n" 选项合用, 用于把top命令重定向到文件中
-n 次数: 指定top 命令执行的次数, 一般和 "-b" 选项合用
-p: 指定PID 。 只查看某个PID 的进程
-s: 使top在安全模式运行, 避免在交互模式中出现错误
-u 用户名: 只监听某个用户的进程
top 交互模式
在top 命令的交互模式当中可以执行的命令
?或h: 显示交互模式的帮助
P: 以CPU使用率排序, 默认就是此项
M: 以内存的使用率排序
N: 以PID 排序
T: 按照CPU 的累积运算时间排序,也就是TIME+项排序
k: 按照PID号,给于某个进程 一个信号。 一般用于终止某个进程,信号9是强制终止的信号
r: 按照PID号, 给某个进程重设优先级(Nice)值
q: 退出top
查看所有的进程信息
如果在操作终端执行top命令, 并不能看到系统中所有的进程,默认看到的只是CPU 占比靠前的进程。 如果我们想要看到所有的进程可以把top 命令的结果重定向到文件当中即可. 不过top命令式持续运行的,这时候就需要 "-h" 和 "-n" 选项里.
top -b -n 1 > /root/top.log
# 让top 命令只执行一次, 然后把结果存到top.log 文件中, 这样就可以看到所有的进程信息了
pstree 命令
用来查看进程的依赖关系
pstree [选项]
选项:
-p: 显示进程的PID
-u: 显示进程的所属用户
杀死进程
系统中可以识别的信号
kill -l 或者用 man 7 signal 来查询
常用的主要信号
信号代码 信号名称 说明
1 SIGNUP 该信号让进程立即关闭, 然后重新读取配置文件之后重启
2 SIGINT 程序终止信号,用于终止前台进程, 相当于输出ctrl + c 快捷键
8 SIGFPE 在发生致命的算术运算错误时发出, 不仅包括浮点运算错误,好包括溢出以及除数为0等其他所有的算术的错误
9 SIGKILL 用来立即结束程序的运行。 本信号不能被阻塞,处理和忽略,一般用于强制终止进程。
14 SIGALRM 时钟定时信号,计算的是实际的时间或时钟时间。 alarm 函数使用该信号.
15 SIGTERM 正常结束进程的信号, Kill 命令的默认信号. 但是有时候进程已经发生问题, 这个信号是无法正常终止进程的,我们才会尝试SIGKILL信号,也就是信号9。
18 SIGCONT 该信号可以让暂停的进程恢复执行, 本信号不能被阻断。
19 SIGSTOP 该信号可以暂停前台进程,相当于输入ctrl+z快捷键. 本信号不能被阻断.
kill 命令
kill [信号] PID
kill -1 PID #让这个进程重启
killall 命令
killall [选项] [信号] 进程名
选项:
-i: 交互式,询问是否要杀死某个进程
-I: 忽略进程名的大小写
用 killall 的好处是 可以不用进程id 号码, 可以直接指定进程名删除进程,这样可以终止一组进程
pkill 命令
pkill 命令和killall 命令非常类似, 也是按照进程名来杀死进程
pkill [选项] [信号] 进程名
选项:
-t 终端号: 按照终端号踢出用户
eg: pkill -9 -t pts/1 #强制杀死从 pts/1 虚拟终端登陆的进程
# 这里有个容易出现错误的地方, -9 一定要放在 -t 前面,不然无效
用 pkill可以 终止一组进程, 用kill 只能终止一个进程