进程管理

3127 字
16 分钟
进程管理

进程管理#

[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 到当前终端

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


05.杀手三剑客#

kill#

常用

后跟进程id,结束进程.

  • 默认什么也不跟,就是kill -15

  • 平滑杀死进程、内存中的数据会写入到磁盘中.不容易丢数据

    • 等同于 systemctl stop
  • kill两次

  • 出现 No such process

    • 说明成功结束

kill -1#

重新加载进程 不会和用户断开

  • 等同于systemctl reload

kill -9#

强制结束

  • 可能正在传输数据,然后就直接被杀死了.

    • ①强制结束后,进程可能起不来了,“受打击了”

    • ②内存数据容易丢失

  • 尽量少用kill -9

pkill#

慎用,很少用

后跟进程名字

  • 支持正则、模糊匹配.(如 pkill fire 能杀 firefox)

killall#

**后跟进程名,全名精准匹配

  • 相当于grep -w

    • killall firefox 才能杀 firefox

⚠️ 特别警告:

  • 在 macOS 或 BSD 系统中,killall 的作用是“杀死所有进程”(用于关机),不是按名字杀进程!

文章分享

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

进程管理
https://www.kpyun.fun/posts/basics/core/core18/
作者
久棹
发布于
2025-08-21
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录