进程管理与监控(ps,top,lsof,grep,kill)

1、进程的概念与分类
进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。
进程的分类
系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。

2、进程的监控与管理
在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的init进程(centos7.x版本是systemd进程)的后代。内核在系统启动的最后阶段启动init进程,因而,这个进程是linux下所有进程的父进程,用PPID表示父进程。
常用的进程管理命令有:
ps、top、lsof、grep、kill、killall

ps -ef

用一般来说[]是系统进程

字段名含义典型值/示例关键说明
1UID启动进程的用户rootmysqlnginx标识谁运行的,安全审计重点关注
2PID进程ID11234唯一标识,用于 killlsof -p
3PPID父进程ID01999谁生了它,排查僵尸进程、挖矿病毒用
4CCPU利用率估算0150近似值,长期 >1 表示活跃
5STIME进程启动时间09:30Jan10当天显示时间,昨天以前显示日期
6TTY关联终端?pts/0tty1?=守护进程,pts/0=SSH登录
7TIME累计CPU占用时间00:00:2301:15:00不是运行时长,是吃CPU的总时间
8CMD完整命令行/sbin/initnginx: worker带参数,ps -efww 防截断

在top可以用f查看显示,然后可以让想添加的添加上来按空格选择

lsof

命令功能说明适用场景示例
lsof -p PID查看指定进程打开的所有文件分析单个进程打开了哪些文件、socket、管道lsof -p 1234
lsof -i查看所有网络连接快速看清谁在监听、谁在连谁lsof -i
lsof -i :端口查看占用指定端口的进程端口被占、服务起不来lsof -i :80
lsof -i TCP:端口查看指定TCP端口的进程区分TCP/UDPlsof -i TCP:25
lsof -i UDP:端口查看指定UDP端口的进程DNS、NTP等lsof -i UDP:53
lsof -c 进程名按进程名首字母匹配不知道PID,只知道程序名lsof -c sshd
lsof -u 用户名查看指定用户打开的文件排查用户资源占用、回收账号lsof -u nginx
lsof -g 进程组ID按进程组查看关联父子进程整体排查lsof -g 4918
lsof +D 目录递归查看目录下所有打开的文件卸载不了磁盘、谁在读写目录lsof +D /var/log
lsof /PATH查看谁在使用某个具体文件文件删不掉、配置文件被锁lsof /var/log/messages
lsof | grep deleted查看已删除但未释放空间的文件df满、du找不到大文件lsof | grep deleted
lsof -i @192.168.1.1查看与指定主机的连接分析网络连接来源lsof -i @10.0.0.1
lsof -i@192.168.1.1:80查看与指定主机+端口的连接精准定位lsof -i@10.0.0.1:443
lsof -i -sTCP:LISTEN只看监听状态的端口只看服务端口,不看已连接lsof -i -sTCP:LISTEN
lsof -i -sTCP:ESTABLISHED只看已建立的连接排查当前活动连接lsof -i -sTCP:ESTABLISHED
lsof -n不解析主机名(加快速度)DNS慢、服务器卡lsof -n -i:80
lsof -P不解析端口名(显示数字)不看service名,直接看端口号lsof -P -i:443
lsof -Fn输出格式为nul分隔(脚本用)写自动化脚本lsof -Fn /var/log
lsof -t只输出PID脚本批量killkill -9 $(lsof -t -i:8080
组合作用
lsof -i -P -n最快查网络,不反解DNS/端口名
lsof +D /path | grep deleted磁盘空间不释放标准排查
lsof -t -i:8080脚本里无脑杀端口
lsof -u www-data -i看某个用户的所有网络连接

利用pgrep查询进程ID
pgrep是通过程序的名字来查询进程pid的工具,它通过检查程序在系统中活动的进程,输出进程属性匹配命令行上指定条件的进程的ID
查看sshd进程对应的所有ID,可执行如下命令:
[root@localhost ~]# pgrep -f sshd
用kill终止一个进程
kill命令的使用语法为:
kill [信号类型] 进程PID
信号类型有很多种,可以通过kill –l查看所有信号类型。常用的信号类型有SIGKILL,对应的数字为9,还有SIGTERM和SIGINT,对应的数字分别为15和2。
 kill -9 进程PID:表示强制结束进程
 kill -2 进程PID:表示结束进程,但是并不是强制性的,常用的ctrl+c组合键发出的就是一个kill -2的信号。
 kill -15 进程PID:表示正常结束进程,是kill的缺省选项,也就是kill不加任何信号类型时,默认类型就是15。

有个kill -0在脚本中使用较多

kill -0 PID 不发送终止信号,只做存活检测。

这是 里最常用的进程存在性检查手段

命令实际作用俗称
kill -9 PID强制杀死下死手
kill -15 PID请求终止礼貌请退
kill -0 PID问:这进程还在吗?伸手探鼻息

执行结果:

进程不存在 → 返回 1($? = 1) echo $?

进程存在 → 返回 0($? = 0)

用killall终止一个进程
killall也是关闭进程的一个命令,与kill不同的是,killall后面跟的是进程的名字,而不是进程的PID,因而,killall可以终止一组进程。
killall的使用语法为:
killall [信号类型] 进程名称
 信号类型:与kill命令中信号类型的含义相同。
 进程名称:进程对应的名称,例如java、httpd、mysqld、sshd、nginx等

进程类型能否kill后果典型进程
用户进程业务中断,可重启nginx、mysql、java
系统服务 看情况部分可重启,部分会导致功能异常systemd-journald、crond、sshd
内核进程 不能杀不掉(实际会拒绝)kworker、kswapd、 migration
PID 1 极危险杀=关机/内核panicsystemd、init

java进程用-9 ,因为正常的话会很慢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注