进程管理

3664 字
18 分钟
进程管理
进程管理

进程管理#

[TOC]



01.进程概述#

  • 内存越大,你同时运行的进程就越多!

pstree#

以树形结构显示进程之间的关系

下载#

yum install -y psmisc

使用#

pstree -p#

显示进程号

⚠️僵尸进程:#

子进程比父进程先结束,而父进程没有回收子进程,也没有释放子进程占用的资源,此时子进程变为僵尸进程

  • **僵尸进程:**挂了,不干活,但是依旧占用着这些资源

如何查看#

top#

ps aux | grep Z#

Z就是僵尸进程的标志!

如何解决?#

①找出僵尸进程的上级进程(父进程),结束掉即可

②如果上级进程为主进程(pid为1的进程,皇帝进程),则需要重新启动Linux系统.

孤儿进程:#

父进程执行完毕,或者异常退出后,子进程仍然运行着.

  • 那么这个子进程就变成了孤儿进程.

  • 孤儿进程会被系统直接接管.

  • 这个孤儿进程也还能用.


02.进程监控命令#

①ps命令#

ps -ef#

[root@oldboy ~]#ps -ef | head -4

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 16<14> ? 00:00<02> /usr/lib/systemd/systemd

主进程PID=1只需记住systemd这个进程名字就够用了.

  • UID: 进程所属用户

  • PID: 进程id号,大部分都是随机的.

  • PPID: 父进程的id号

    • pstree -p查看详细关系

  • CMD: 进程名字

ps aux#

虽然 ps -ef 与 ps aux 命令都能查看进程运行情况,但两者之间还是有一些细致区别.

输出示例:

进程状态:#

STAT基本状态描述STAT状态+符号描述
R进程运行s父进程,管理进程
S可中断睡眠<高优先级
T进程被暂停N低优先级
D不可中断睡眠+进程运行在前台
Z僵尸进程l(小写)进程是多线程的
**I** Idle(空闲)
**意味着该进程(通常是内核线程)**正在等待事件发生
它不会消耗 CPU 时间,但处于“准备响应”的状态.
  • **进程名带 [ ] 都是些Linux内核进程 **

  • S(可中断睡眠)和Ss就是top中的sleeping进程!

  • T(被挂起的进程)就是top中的stopped进程!

  • S+前台运行

  • 多线程得需要软件支持!
使用tar打包文件时,另一个窗口可以通过ps aux查看状态,由S+,R+变为D+
[root@lzy ~]# ps axu|grep tar|grep -v grep
root     14289  2.6  0.1 124268  1888 pts/2    S+   10:56   0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root     14289  2.7  0.2 124380  2240 pts/2    R+   10:56   0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
 [root@lzy ~]# ps axu|grep tar|grep -v grep
root     14289  2.9  0.2 124916  2724 pts/2    D+   10:56   0:01 tar zcf etc.tar.gz /etc/ /usr/ /var

常见的进程状态:

  1. R+ 前台运行中的进程

  2. Ss 可中断的管理进程

  3. S< 可中断的高级进程

  4. Ssl 可中断的多线程的管理进程

  5. D 不可中断的IO进程

  6. Z 僵尸进程

两个ps命令的区别:

  1. 在 ps -ef 中,**查看所有进程及其详细信息,并显示父进程 ID.

  2. 在 ps aux 中, 包含了%CPU和%MEM列以及进程的状态信息,

  3. 重点在资源使用情况,像CPU%和内存%的占用率等等.

**ps aux 没有 - **

🧣pgrep#

Terminal window
# 按条件查找进程
(1)列出包含sshd的PID和进程名
[root@Rocky10 home]# pgrep -l sshd
1405 sshd
1452 sshd-session
1913 sshd-session
(2)列出root用户的所有进程
'root用户的进程太多了,不建议查看root用户的!'
[root@Rocky10 home]# pgrep -u root
1
2
(3)列出指定终端的进程
root@Rocky10:~# who
root pts/0 2026-03-06 09:12 (10.0.0.1)
root seat0 2026-03-06 14:16 (login screen)
root tty2 2026-03-06 14:16 (tty2)
[root@Rocky10 home]# pgrep -t pts/0
1919
# 这个pts是伪终端,也就是Xshell连接的那个!
'你一看这个终端登录了,之后通过查看登录终端的进程,可以指定杀它'
# 按的是终端查看,而不是用户
root@Rocky10:~# kill -9 1919
root@Rocky10:~# who
root seat0 2026-03-06 14:16 (login screen)
root tty2 2026-03-06 14:16 (tty2)
[root@Rocky10 home]# Connection closing...Socket close.
# 我们回到Xshell,连接中断!

②top命令#

  • 它是个交互式的命令

    • 下面有它的快捷键
  • 可以非交互式

输出完之后,自动退出

- **top -bn1**
- -b 非交互式模式
- -n 输出的次数为1次
  • 可以展示系统负载,进程,CPU,内存…

  • 类似于Windows的任务管理器

什么是中断?

中断就是终止当前在做的事情 去执行另一段程序

会保留现场,执行的那段程序做完之后会再回来执行刚来尚未完成的部分

us和sy#

**us用户态:** 用户执行命令占用CPU百分比
yum -y install wget
**sy内核态:** 硬件执行占用CPU百分比
用户态:
**由服务通知CPU**
没有办法直接调用硬件
**内核态:**
**CPU调用我们的内核驱动**
**调用磁盘读取内容**

快捷键#

  • 按完z后,紧跟着的就是x

  • 和 < 向左向右

  • 1可以查看多个CPU核心数

htop#

需要提前配置好epel源,然后安装即可

yum -y install htop

  • 这个功能非常齐全.

取僵尸进程个数#

利用到非交互模式

未来想要取top命令的结果,指标,需要让top命令运行在非交互模式

top -bn1 | awk ‘NR==2{print NF"僵尸进程的个数为"NF"僵尸进程的个数为"(NF-1)}’

  • top -bn1

    - -b 非交互式模式
    - -n 输出的次数为1次
  • 这里利用 ” “双引号替代 ,逗号 进行分隔.

  • NR==2 取第二行

③lsof#

用于列出当前系统中被进程打开的文件**

详细内容请看磁盘相关案例

🧣负载高?#

  • 负载高和系统的可运行状态(R,S)和不可中断(D)(读写IO)的平均进程数有关.

    • 系统的繁忙程度

    • 越接近CPU核心数,系统的负载越高.

  • 如果是CPU导致,是us还是sy,上面有详细的区分

  • IO高用iotop -o进一步排查

iotop -o#

显示正在读写的进程

yum -y install iotop


03.ps常见操作:#

①过滤出进程信息:#

ps -ef | grep ‘crond’

ps aux | grep ’crond‘

ps -ef | grep ’crond‘ | grep -v ’grep‘

-v 排除自己的grep进程

ps -ef | grep ’crond‘ | grep -v ’grep‘ | wc -l

并统计进程的数量

  • 尽可能的详细,排除掉没有用的信息!

②按照树形结构查看进程信息#

③显示某几列#

  • 逗号隔开!

不显示标题#

④取出某个进程的指定列#

⑤取出所有进程中内存使用率最高的前5#

使用sort进行排序

ps aux —no-heading | sort -rnk4 | head -5

  • k4 按第四列内存使用率排序

  • rn 按数字,倒序排序

  • —no-heading 不显示标题

  • head -5 取前五名

ps aux —no-heading —sort=-%mem | head -5

  • —sort 默认是升序排

    • 指标前面加 - 减号表示降序排序

04.后台管理#

概述#

前台

前台运行,当前正在用的软件或进程.

  • ps aux进程状态中,带有+,表示前台运行的进程.

  • Xshell远程连接,敲的命令都是前台命令.

- **断开连接后,**前台命令结束,进程结束.**
  • 所以一些临时的操作,就给前台了.

后台

后台运行,“默默无闻”的运行.

  • 大部分软件和进程都是在后台运行.

  • ps aux进程状态中,大部分都不带+,后台运行

  • 即使Xshell连接断开,也会持续运行.

root@rocky10:~# vim 1.sh
root@rocky10:~# cat 1.sh
#! /bin/bash
while :
do
date >> /root/1.txt
sleep 1
done
root@rocky10:~# > /root/1.txt
运行./1.sh,然后关闭终端,然后cat /root/1.txt,验证脚本停止运行,没有新的写入
运行./1.sh &,然后关闭终端,然后cat /root/1.txt,验证脚本停止运行,没有新的写入
# 这个是把它放在后端运行了!

进入后台运行#

①⭐&方法#

最常用的方法

  • 隔一个空格再去接&

  • jobs可以查看手动进入到后台的进程

[root@oldboy ~]#sleep 999 &

[1] 2781

[1]表示手动进入到后台的第1个进程 2781表示进程号

[root@oldboy ~]#sleep 999 &

[2] 2782

这个同理为第二个…

[root@oldboy ~]#jobs

[1]- Running sleep 999 &

[2]+ Running sleep 999 &

Terminal window
jobs # 列出当前shell的所有后台作业
jobs -l # 显示详细信息,包括PID
'主要是这个PID'
[root@Rocky10 ~]# sleep 33 &
[1] 4190
[root@Rocky10 ~]# jobs
[1]+ Running sleep 33 &
[root@Rocky10 ~]# jobs -l
[1]+ 4190 Running sleep 33 &

②nohup命令和&方法#

  • 会在当前目录生成一个nohup.out,默认保存在这里!

  • 想要输出到其他文件中

    • nohup 命令 >新的文件 &

      • 覆盖

      • 追加

③ctrl + z#

一般很少使用

并非撤销键

  • 让当前运行的命令或者服务进入后台挂起

    - **并非后台运行**,**而是挂起**
  • 被暂停,对应ps aux进程状态的T

Terminal window
[root@Rocky10 ~]# jobs
[1]+ Running sleep 33 &
`%n`(n为jobs命令显示的作业号)
bg - 后台继续运行
bg # 恢复最近停止的后台作业
bg %1 # 恢复作业号为1的后台作业
fg - 前台运行作业
fg # 将最近的后台作业调到前台
fg %1 # 将作业号1调到前台
  • bg让“挂起暂停”的进程和服务,跑到后台运行

    • 两者结合相当于&,直接跑后台运行.

  • 如果误触 ctrl + z 可以通过 fg 再次回到前台运行.

④⭐screen#

一般我们使用&,nohup方法让命令,服务进入后台运行,但是可能不稳定

  • 它是较为稳定的去运行后台的一些指令

  • **不运行大型的的服务,只是一些简单指令命令.

**原理:**
**screen 本身并不会自动把里面的命令变成 “后台进程” .**
**它只是提供了一个可脱离的虚拟终端环境.**
在 screen 会话里运行的命令,**默认仍然是前台进程(相对于那个虚拟终端而言)**.
**只是相对我们的屏幕终端,进入到了screen里面的虚拟终端“后台”**
创建一个screen会话,只要会话还在,里面的命令就不会断;
即使exit退出
只要screen -ls还能查到会话
命令就不会断
  1. 安装screen

yum -y install screen

  1. 创建命名会话

[root@oldboy ~]#screen -S test

  • -S(大写)新建会话

  • 直接进入到会话里面

    • 执行命令sleep 999

    • ctrl+a+d脱离当前会话

  • 终端会显示:[detached from 1580.test]

    - 1580是会话ID
    - -S新建的会话名test
    - 用 . 点隔开
    - **detached:安全可恢复**
  1. ​退出会话
  • ctrl+a+d脱离当前会话

    • 正常退出,后面可以-r恢复
  • 强制退出,彻底结束

    • 后面-ls查不到这个会话,关闭了这个会话

      • ctrl+d

      • exit

    • ctrl+c是中止停止运行

      • 直接把进程关闭了
  1. 查看所有的会话

[root@oldboy ~]#screen -ls

There are screens on:

1876.*oldboy* **(Detached)**
1580.*test* **(Attached)**

2 Sockets in /run/screen/S-root.

  • 前面是会话ID

  • 后面是-S创建的会话名

这个是默认screen进来.

  1. 两种状态详解

✅ (Detached):安全可恢复

  • 表示该 screen 会话,当前没有被任何终端连接.

  • 它在后台安静运行,处于空闲状态.

  • 你可以直接用 screen -r 恢复它,没有任何风险.

screen -r 会话名

screen -r 会话ID

✅ 这是最常见的理想状态 —— 断开后想回来继续工作.

⚠️ (Attached):已被占用

  • 表示该 screen 会话,当前正被另一个终端(或 SSH 会话)连接着.

  • **此时直接 screen -r 会失败

如何处理这种状态??

screen -dr 会话名或会话ID

  • -d:先将该会话从“Attached”状态 强制 detach

  • -r:然后立即 attach 到当前终端

💡 这是最常用、最安全的做法(前提是你确认没人正在用).


杀手三剑客#

kill — 按 PID 杀进程#

后跟 ==进程 ID==,结束进程,最常用

Terminal window
kill [信号] PID
kill -l # 列出所有信号
场景命令效果
默认(-15)kill 1234平滑终止,内存数据==写入磁盘==
重载配置(-1)kill -1 1234重新加载,==不断开连接==
强制杀死(-9)kill -9 1234立刻终止,可能==丢数据==

(1)默认信号 ==kill -15==

  • 平滑杀死进程,内存中的数据会写入到磁盘
  • 等同于 systemctl stop
  • kill 两次出现 No such process → 说明成功结束

(2)kill -1:重载配置

  • 重新加载进程,不会和用户断开
  • 等同于 systemctl reload

(3)kill -9:强制结束

  • 可能正在传输数据,直接就被杀死了
  • ① 强制结束后,进程可能起不来了,“受打击了”
  • ② 内存数据容易丢失
  • 尽量少用 kill -9

pkill — 模糊匹配进程名#

慎用,很少用;后跟进程名,支持正则、模糊匹配

Terminal window
pkill fire # 能杀 firefox(进程名含 "fire" 的全都匹配)
选项匹配对象精度风险
pkill(默认)==进程名==模糊中
pkill -f==完整命令行==最宽泛⚠️ 高
  • ps -ef 的 CMD 列显示完整命令行,但进程名是程序本身的名称(比如 sshd)
  • pkill 默认杀进程名(不是命令行),pkill -f 才杀命令行

进程名 vs 命令行

概念含义查看方式
进程名 (comm)程序的可执行文件名ps -eo comm
命令行 (cmd)完整的启动命令和参数ps -eo cmd
Terminal window
ps -eo pid,comm,cmd | grep sshd
# PID | comm | cmd
# 1234 | sshd | sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
# 同一进程的进程名和命令行,看到的内容是不一样的!

pkill -f#

  • pkill -f 匹配的是整个命令行字符串,比 pkill 更宽泛,更容易误杀
  • 适用场景:进程名跟程序名对不上号的情况
  • 比如 Java 程序——不管跑的是 Logstash 还是 ES,进程名统一都是 java,只有命令行才暴露身份

killall — 精准匹配进程名#

安全,常用;后跟全名,精准匹配进程名

Terminal window
killall firefox # 只杀 firefox
killall fire # ❌ 杀不到 firefox(不是全名)
命令匹配方式杀 firefox 的方式
killall==精准匹配==(≈ grep -w)killall firefox
pkill模糊匹配pkill fire ✅ 或 pkill firefox
Warning

⚠️ **特别警告:在 macOS 或 BSD 系统中,killall 的作用是”杀死所有进程”(用于关机),**不是按名字杀进程!


三剑客对比#

命令匹配对象精度对应 grep常用度
killPID==最精准==—⭐⭐⭐⭐
killall进程名(全名)==精准==grep -w⭐⭐⭐
pkill进程名(模糊)模糊grep⭐⭐
pkill -f完整命令行==最宽泛==grep(命令行)⭐

🌰 ElasticStack 场景实战

Terminal window
ES/Kibana → systemctl 管理 → systemctl stop elasticsearch
Filebeat → 裸进程 → killall -9 filebeat ✅️ 进程名就是 filebeat,精准
Logstash → 裸进程 → pkill -f -9 logstash ⚠️ 进程名是 java,只能匹配命令行
Caution

❌ 绝对禁止 killall -9 java 会同时杀掉 ES + Logstash + Tomcat + 任何 Java 进程

这就是为什么 Logstash 只能用 pkill -f 而不能用 killall java 的原因

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
久棹
不是先学好了再干,而是先干起来再学习,干中学!
分类
站点统计
文章
115
分类
15
标签
272
总字数
306,562
运行时长
0 天
最后活动
0 天前
文章目录