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
用一般来说[]是系统进程
| 列 | 字段名 | 含义 | 典型值/示例 | 关键说明 |
|---|---|---|---|---|
| 1 | UID | 启动进程的用户 | root、mysql、nginx | 标识谁运行的,安全审计重点关注 |
| 2 | PID | 进程ID | 1、1234 | 唯一标识,用于 kill、lsof -p |
| 3 | PPID | 父进程ID | 0、1、999 | 谁生了它,排查僵尸进程、挖矿病毒用 |
| 4 | C | CPU利用率估算 | 0、1、50 | 近似值,长期 >1 表示活跃 |
| 5 | STIME | 进程启动时间 | 09:30、Jan10 | 当天显示时间,昨天以前显示日期 |
| 6 | TTY | 关联终端 | ?、pts/0、tty1 | ?=守护进程,pts/0=SSH登录 |
| 7 | TIME | 累计CPU占用时间 | 00:00:23、01:15:00 | 不是运行时长,是吃CPU的总时间 |
| 8 | CMD | 完整命令行 | /sbin/init、nginx: 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/UDP | lsof -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 | 脚本批量kill | kill -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 | 极危险 | 杀=关机/内核panic | systemd、init |
java进程用-9 ,因为正常的话会很慢
发表回复