查看和控制进程
一 查看进程
命令 | 功能描述 | 常用选项 / 示例 |
---|---|---|
ps | 查看静态进程信息 | ps aux (显示所有用户进程)ps -ef (显示进程树) |
top | 实时动态监控进程(CPU / 内存占用等) | 按 M 排序内存占用,按 P 排序 CPU 占用,按 q 退出 |
pgrep | 根据进程名或属性过滤进程 | pgrep -l firefox (显示进程名和 PID) |
pstree | 以树形结构显示进程关系 | pstree -p (显示 PID)pstree -u (显示用户) |
1.ps命令——查看静态的进程统计信息
选项组合 | 功能描述 | 示例说明 |
---|---|---|
ps aux | 显示所有用户的进程(BSD 风格),包括隐藏进程 | USER PID %CPU %MEM ... (各列含义见下文) |
ps -ef | 显示完整格式的进程信息(System V 风格),包含父进程 PID 和命令行参数 | UID PID PPID C STIME ... (适合查看进程树) |
ps -l | 显示长格式信息,包含进程状态、优先级等 | F S UID PID PPID C PRI ... |
ps -axjf | 以树形结构显示进程关系,包含线程信息(需 root 权限) | 类似 pstree 但更详细 |
3. 输出字段解释
以 ps aux
为例,常见列含义:
- USER:进程所有者
- PID:进程 ID
- %CPU:CPU 占用百分比
- %MEM:内存占用百分比
- VSZ:虚拟内存大小(KB)
- RSS:常驻内存大小(KB)
- TTY:终端设备(
?
表示无终端) - STAT:进程状态(如
R
运行、S
睡眠、Z
僵死、D
不可中断睡眠) - START:进程启动时间
- TIME:累计 CPU 时间
- COMMAND:启动命令
4. 高级用法
-
过滤进程:
bash
ps aux | grep firefox # 查找包含 "firefox" 的进程 ps -C firefox # 直接查找名为 "firefox" 的进程
-
按字段排序:
bash
ps -eo pid,user,%mem --sort=-%mem # 按内存占用降序排序
-
结合
awk
处理输出:bash
ps -eo pid,command | awk '$1 > 1000 {print $0}' # 显示 PID > 1000 的进程
2.top命令——查看进程动态信息
界面结构
plaintext
top - 15:30:45 up 1 day, 2:15, 2 users, load average: 0.34, 0.45, 0.47
Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7932.8 total, 1234.5 free, 4567.2 used, 2131.1 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 3456.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 4096M 1024M 200M S 5.0 13.0 0:02.34 firefox
各部分含义:
-
系统摘要:
load average
:1/5/15 分钟平均负载(理想值 < CPU 核心数)。Tasks
:总任务数、运行中、睡眠、停止、僵死进程数。%Cpu(s)
:CPU 使用百分比(us
用户态,sy
内核态,id
空闲)。Mem/Swap
:内存和交换分区使用情况。
-
进程列表:
- PID:进程 ID。
- USER:进程所有者。
- PR:优先级(数值越小优先级越高)。
- NI:nice 值(调整优先级,范围 -20 ~ 19,负值优先级更高)。
- VIRT/RES/SHR:虚拟内存 / 常驻内存 / 共享内存。
- S:进程状态(
R
运行,S
睡眠,D
不可中断睡眠,Z
僵死)。 - %CPU/%MEM:实时 CPU 和内存占用率。
- TIME+:累计 CPU 时间(格式为
DD:HH:MM:SS
)。
3. 常用交互命令
按键 | 功能描述 |
---|---|
M | 按内存占用排序(默认按 CPU) |
P | 按 CPU 占用排序 |
T | 按累计 CPU 时间排序 |
k | 终止进程(输入 PID 后按回车,默认发送 SIGTERM 信号) |
r | 调整进程优先级(输入 PID 后输入 nice 值) |
h | 显示帮助文档 |
1 | 显示每个 CPU 核心的使用率 |
H | 显示线程(默认显示进程) |
q | 退出 top |
4. 高级用法
-
自定义显示字段:
bash
top -o %MEM # 按内存排序启动 top -f # 选择显示的列(按 `f` 后移动光标选择字段)
-
指定刷新频率:
bash
top -d 5 # 每 5 秒刷新一次(默认 3 秒)
-
查看历史记录:
bash
top -b -n 10 > top.log # 以批处理模式输出 10 次结果到文件
3.pgrep命令——查看进程信息
pgrep
(Process Grep)用于根据进程名称、用户、状态等属性快速查找进程 ID(PID),是 ps aux | grep
的简化版,适合脚本或快速定位进程。
常用选项
选项 | 功能描述 |
---|---|
-u username | 按用户过滤进程(支持 UID) |
-x | 精确匹配进程名称(避免部分匹配) |
-l | 显示进程名(默认仅显示 PID) |
-n | 显示最新启动的进程(Newest) |
-o | 显示最旧启动的进程(Oldest) |
-P pid | 查找指定父进程的子进程(支持多父进程 , 分隔) |
-t tty | 按终端过滤(如 pts/0 , tty1 ) |
-s sid | 按会话 ID 过滤 |
-g gid | 按进程组 ID 过滤 |
-f | 匹配完整命令行(而非仅进程名) |
-v | 反向匹配(排除包含关键字的进程) |
-V | 显示版本信息 |
3. 输出格式
bash
pgrep [选项] pattern
- 无选项:输出匹配进程的 PID。
- -l:输出
PID 进程名
。 - -f:输出
PID 完整命令行
。
4. 实战示例
-
按进程名查找:
bash
pgrep sshd # 查找所有名为 sshd 的进程 pgrep -x sshd # 精确匹配(排除如 sshd: 的子进程)
-
按用户过滤:
bash
pgrep -u mysql # 查找 MySQL 用户的进程 pgrep -u 1000 # 按 UID 查找
-
显示进程名和 PID:
bash
pgrep -l firefox # 输出类似 "1234 firefox"
-
查找最新或最旧进程:
bash
pgrep -n java # 查找最新启动的 Java 进程 pgrep -o java # 查找最旧启动的 Java 进程
-
按父进程 ID 查找子进程:
bash
pgrep -P 1234 # 查找父进程为 1234 的所有子进程
-
按终端过滤:
bash
pgrep -t pts/0 # 查找在 pts/0 终端运行的进程
-
匹配完整命令行:
bash
pgrep -f "java -jar app.jar" # 精确匹配完整命令
-
反向匹配(排除特定进程):
bash
pgrep -v grep # 查找所有非 grep 的进程
5. 结合其他命令使用
-
终止匹配的进程:
bash
pgrep firefox | xargs kill # 杀死所有 firefox 进程
-
查看进程详细信息:
bash
pgrep -l mysql | awk '{print $1}' | xargs ps -f # 显示 MySQL 进程详细信息
-
监控进程状态:
bash
while true; do pgrep -l redis && sleep 1; done # 循环检查 Redis 是否存活
4.pstree命令——查看进程树
1. 基础功能
pstree
以树状结构展示进程间的父子关系,直观呈现系统中进程的层级分布,便于快速定位服务依赖或排查僵尸进程。
2. 常用选项
选项 | 功能描述 |
---|---|
-u | 显示进程所属用户(支持 UID) |
-p | 显示进程 ID(PID) |
-a | 显示完整命令行参数 |
-n | 按 PID 排序(默认按进程名排序) |
-c | 不合并相同子进程(避免因重复而折叠显示) |
-h | 高亮显示当前终端进程($PPID ) |
-l | 允许长输出(换行显示长命令行) |
-s pid | 从指定 PID 开始向上追溯父进程链 |
-T | 使用文本字符绘制树(兼容非 Unicode 环境) |
-U | 使用 UTF-8 字符绘制树(默认) |
-Z | 显示进程安全上下文(SELinux 相关) |
-G | 使用 ASCII 字符绘制树(与 -T 类似) |
3. 输出格式
bash
pstree [选项] [pid/process_name]
- 无参数:以
systemd
(或init
)为根显示所有进程。 - 指定 PID / 进程名:仅显示该进程及其子进程。
4. 实战示例
-
基础用法:
bash
pstree # 显示所有进程的树状结构 pstree -p # 显示进程 PID pstree -u # 显示进程所属用户
-
过滤特定进程:
bash
pstree sshd # 仅显示 sshd 及其子进程 pstree -s 1234 # 从 PID 1234 向上追溯父进程链
-
美化输出:
bash
pstree -aUl # 显示完整命令行、用户、允许换行 pstree -Tn # 按 PID 排序并显示进程名
-
查看用户进程:
bash
pstree -u username # 显示指定用户的所有进程树
-
高亮当前终端进程:
bash
pstree -h # 高亮显示当前终端的父进程(如 bash)
5. 输出解读
bash
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─agetty
├─bash───pstree
└─sshd───sshd───bash
- 符号说明:
─
:普通子进程。├─
:分支子进程。└─
:最后一个分支。*[]
:表示多个相同子进程(如2*[bash]
表示两个 bash 进程)。
6. 结合其他命令使用
-
杀死进程树:
bash
pstree -p nginx | grep -oP '\d+' | xargs kill -9 # 终止 nginx 及其子进程
-
生成进程树图片:
bash
pstree -p | dot -Tpng -o process_tree.png # 需要安装 graphviz
-
监控特定进程变化:
bash
watch -n 1 pstree -p sshd # 每秒刷新 sshd 进程树
7. 注意事项
-
权限问题:
- 普通用户只能查看自己的进程,
sudo pstree
可显示所有进程。
- 普通用户只能查看自己的进程,
-
输出折叠:
- 默认会合并相同子进程(如
2*[bash]
),使用-c
可禁用此行为。
- 默认会合并相同子进程(如
-
性能影响:
- 系统进程较多时,
pstree
可能短暂卡顿(建议结合过滤条件使用)。
- 系统进程较多时,
8. 替代工具
htop
:交互式查看进程树(按F5
显示树状结构)。ps --forest
:文本形式显示进程树。systemd-cgls
:查看 systemd 控制组的进程树。
9. 示例场景
-
排查服务依赖:
bash
pstree -a redis-server # 查看 Redis 服务的依赖进程
-
定位僵尸进程:
bash
pstree -p | grep defunct # 查找标记为 defunct 的僵尸进程
-
验证终端会话:
bash
pstree -h # 查看当前终端(如 bash)的父子进程关系
二 控制进程
1.启动进程
(1)手工启动进程
由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。
进程在前台运行(如执行“1s-1”命令)时,用户必须等到该进程执行结束并退出以后才能继续输入其他命令,大多数命令操作在前台启动运行。进程在后台运行时,用户可以继续在当前终端中输入其他命令,而无须等待该进程结束,适用于运行耗时较长的操作。
启动后台进程需要使用“&”操作符,将“&”操作符放在要执行命令的最后面,进程启动后会直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。例如,当使用cp命令从光盘中制
作镜像文件时,由于需要复制的数据较多,耗时较长,因此可结合“&”符号将复制操作放到后台运行,以便用户可以继续执行其他命令操作,代码如下:
[root@localhost ~]# cp /dev/cdrom mycd.iso &
[1] 6426 #输出信息中包括后台任务序号,PID号
(2)调度启动进程
在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份),这些任务
更适合在相对空闲的时候(如夜间)进行。这时就需要用户事先进行调度安排,指定任务运行的时间,当系统到达设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。
进程的调度启动可以通过at、crontab 命令进行设置,其中at命令用于设置一次性(如12:15时
重启网络服务)计划任务,crontab命令用于设置周期性运行(如每周五17:30备份数据库)的计划任务。
2.改变进程的运行方式
(1)挂起当前进程
当Linux 操作系统中的命令正在前台执行时(运行尚未结束),按Ctrl+2组合键可以将当前进程挂起(调入后台并停止执行),这种操作在需要暂停当前进程并进行其他操作时特别有用。例如,在使用 cp 命令镜像文件时,发现复制速度缓慢,为了不耽误其他操作,可以按Ctr1+Z组合键将该下载任务调入后台并暂停执行,代码如下:
[root@node01 ~]# cp /dev/cdrom mycd.iso
^Z
[1]+ 已停止 cp -i /dev/cdrom mycd.iso
(2)查看后台的进程
需要查看当前终端中在后台运行的进程任务时,可以使用jobs命令,结合“-1”选项可以同时显示该进程对应的PID号。在jobs命令的输出结果中,每一行记录对应一个后台进程的状态信息,行首的
数字表示该进程在后台的任务编号。若当前终端没有后台进程,将不会显示任何信息。例如,执行如下的“jobs -l”命令可以看到前面挂起的wget下载任务的相关信息。
[root@node01~]#jobs -l
[1]+ 4864 Stopped cp -i/dev/cdrom mycd.iso
(3)将后台的进程恢复运行
使用bg(BackGround,后台)命令,可以将后台中暂停执行(如按Ctr1+Z组合键挂起)的任务恢复运行,继续在后台执行操作;而使用fg命令(ForeGround,前台),可以将后台任务重新恢复到前台运行。
除非后台中的任务只有一个,否则bg 和 fg命令都需要指定后台进程的任务编号作为参数。例如,
执行如下的“fg 1”命令可以将之前挂起至后台的wget进程重新调入前台执行。
[root@node01~]# fg 1
cp -i /dev/cdrom mycd.iso
3.终止进程执行
当用户在前台执行某个进程时,可以按Ctrl+C组合键强制进行中断(如命令长时间没有响应的情况下)。中断前台进程的运行后,系统将返回命令行提示符状态等待用户输入新的命令。当按Ctrl+C 组合键无法终止程序或者需要结束在其他终端或后台运行的进程时,可以使用专用的进程终止工具kill、 killall 和 pkill
(1)使用kill命令终止进程
通过 kill 命令终止进程时,需要使用进程的 PID号作为参数。无特定选项时,kill命令将给该进程发送终止信号并正常退出运行,若该进程已经无法响应终止信号,则可以结合“-9”选项强行终止进程。强制终止进程时可能会导致程序运行的部分数据丢失,因此不到不得已时不要轻易使用“-9”选项。
(2)使用killall命令终止进程
使用 killall 命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令将更加方便,效率更高。killall命令同样也有“-9”选项。例如,执行如下的“killall-9 vim”命令可将所有名为 vim 的进程都强行终止。
(3)使用pkill命令终止进程
使用pkill 命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似,如“-U”(指定用户)、“t”(指定终端)等选项,使用起来非常方便。例如,若要终止由用户zhangsan启动的进程(包括登录Shell) 。
计划任务管理
一 at 一次性任务设置
二 安装顺序
使用at命令设置的计划任务只在指定的时间点执行一次,前提是对应的系统服务atd必须已经运行。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后,否则将无法正确设置计划任务。
设置一次性计划任务时,在at命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带“at>”提示符的任务辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按Ctrl+D组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。
三 crontab 周期性任务设置
1.crontab的配置文件和目录
(1)/etc/crontab——系统任务配置文件
/etc/crontab文件中设置的是维护Linux操作系统所需的任务,Linux操作系统及相关程序在安装时可自动设置,不建议用户手动修改此文件。例如,该文件中包括设置Shel1环境、可执行路径等变量的操作,以及每小时、每天、每周、每月需要执行的任务目录。执行如下的“cat/etc/crontab”命令可以查看/etc/crontab文件的具体内容。
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash //设置执行计划任务的Shell 环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin //定义可执行命令及程序的路径
MAILTO=root //将任务输出信息发送到指定用户的邮箱
(2)/var/spool/cron/——用户cron任务的配置文件存放目录
由用户自行设置(使用crontab 命令)的cron计划任务将被保存到目录/var/spool/cron/中,文件名与用户名相同。例如,通过如下操作可以得知,root用户的cron计划任务保存在配置文件/var/spool/cron/root中
[root@localhost ~]# ls -l /var/spool/cron/*
-rw-- -----. 1 root root 33 May 7 11:01 /var/spool/cron/root
2.使用crontab命令管理用户的计划任务
设置用户的周期性计划任务列表主要通过crontab 命令进行,结合不同的选项可以完成不同的计划
任务管理操作。常用的选项如下。
- -e:编辑计划任务列表。
- -u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己)
- -l:列表显示计划任务。 -r: 删除计划任务列表。
- -r:删除计划任务列表
(1)编辑用户的计划任务列表
crontab -e
(2)查看用户的计划任务列表
crontab -l
(3)删除用户的计划任务列表
crontab -r