进程管理
进程管理是Linux系统管理的核心功能之一,它允许用户监控、控制和优化系统中运行的进程。通过进程管理,我们可以了解系统资源的使用情况,识别并终止异常进程,以及调整进程优先级来优化系统性能。
Linux提供了丰富的进程管理命令,这些命令可以帮助我们查看进程状态、管理进程生命周期、控制进程资源使用等。本章节将详细介绍常用的Linux进程管理命令,包括ps、top、kill、pkill、killall、pstree、nohup和jobs等。
ps - 显示系统进程状态
ps命令来自英文单词process的缩写,中文译为“进程”,其功能是显示当前系统的进程状态。使用ps命令可以查看到进程的所有信息,例如进程的号码、发起者、系统资源(处理器与内存)使用占比、运行状态等。ps命令可帮助我们及时发现哪些进程出现“僵死”或“不可中断”等异常情况。 ps命令经常会与kill命令搭配使用,以中断和删除不必要的服务进程,避免服务器的资源浪费。
语法格式
ps [选项]选项
| 选项 | 说明 |
|---|---|
| -A | 显示所有进程(同 -e) |
| -e | 显示所有进程 |
| -a | 显示终端上的所有进程(除会话引导进程) |
| -d | 显示所有进程(除会话引导进程) |
| -f | 完整格式输出(显示命令行参数) |
| -F | 额外完整格式(比 -f 更多字段) |
| -H | 显示进程层次结构 |
| -j | 显示作业控制信息 |
| -l | 长格式输出 |
| -L | 显示线程(LWP和NLWP列) |
| -M | 显示安全上下文(SELinux) |
| -o | 用户自定义格式 |
| -y | 不显示标志(与 -l 一起使用) |
| -Z | 显示安全上下文(同 -M) |
BSD风格选项
| 选项 | 说明 |
|---|---|
| aux | 显示所有用户的所有进程(常用组合) |
| -T | 显示该终端的所有进程 |
| -m | 显示线程 |
| -r | 只显示运行中的进程 |
| -x | 显示无控制终端的进程 |
GNU长选项
| 选项 | 说明 |
|---|---|
| --forest | 树形显示进程层次 |
| --sort | 指定排序字段(+field升序,-field降序) |
| --headers | 重复显示标题行 |
| --no-headers | 不显示标题行 |
| --format | 自定义输出格式(同 -o) |
| --pid | 显示指定PID的进程 |
| --ppid | 显示指定PPID的子进程 |
| --quick-pid | 快速检查指定PID |
输出格式控制
%cpu # CPU使用率
%mem # 内存使用率
args # 完整命令行
cmd # 简单命令名
command # 命令名
etime # 进程运行时间
euser # 有效用户名
fgroup # 文件系统组名
lstart # 进程启动时间
lWP # 线程号
NLWP # 该进程中的线程数
ni # nice值,优先级修改值取值范围-20到20
pcpu # CPU百分比(同%cpu)
pgid # 进程组ID
pid # 进程ID
ppid # 父进程ID
pri # 优先级
rss # 驻留集大小(内存)
stat # 进程状态
S # 休眠状态进程
R # 运行状态进程
D # 不可中断(正在等待系统分配资源)
+ # 运行在前台进程
Z # 僵尸进程(需要定期清理)
time # 累计CPU时间
tty # 控制终端
? # 系统启动进程
tty # 本地登录
pts # 远程登录
user # 用户名
vsz # 虚拟内存大小经典案例
ps -ef # UNIX风格
ps aux # BSD风格
ps aux --sort=-pcpu | head -10 # 按CPU使用率降序前10
ps aux --sort=-pmem | head -10 # 按内存使用率降序前10
ps -ef --forest # 树形显示进程关系
ps -ef | grep nginx # 模糊匹配进程名
ps -C sshd -f # 精确匹配命令名
ps -p 1234,5678 # 按PID筛选
ps -L -p <PID> # 查看指定进程的线程
ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu # 仅显示指定列
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10 # 监控高CPU进程kill – 杀死进程
kill 命令用于向进程发送信号,以终止、暂停或恢复进程的运行。它通过进程ID(PID)识别目标进程,并支持多种信号类型,允许用户以不同方式控制进程行为。
默认信号:SIGTERM (15)(请求正常终止进程)
语法格式
kill [选项] <PID>...
kill -<信号> <PID>...
kill -l [信号编号]信号选项
| 信号编号 | 信号名 | 说明 | 常用场景 |
|---|---|---|---|
1 | SIGHUP | 挂断进程,通常用于重启或重新加载配置(如守护进程) | kill -1 <PID> 或 kill -HUP48 |
2 | SIGINT | 中断进程(等同于 Ctrl+C) | 交互式程序终止 |
9 | SIGKILL | 强制终止,进程无法捕获或忽略,直接由内核处理 | 顽固进程终止17 |
15 | SIGTERM | 默认信号,请求进程正常退出(允许清理资源) | kill <PID>39 |
18 | SIGCONT | 恢复已暂停的进程 | 结合 SIGSTOP 使用 |
19 | SIGSTOP | 暂停进程(不可捕获或忽略),等同于 Ctrl+Z | 调试或暂停任务 |
选项
| 选项 | 说明 |
|---|---|
-l | 列出所有信号名称 |
-s <信号> | 指定信号(如 -s 9 或 -s SIGKILL) |
-<信号> | 直接使用信号(如 -9 或 -KILL) |
经典案例
kill 1234 # 默认信号(SIGTERM)终止进程
kill -9 1234 # 强制终止(SIGKILL)
kill -15 1234 # 明确指定 SIGTERM 信号
kill -HUP 1234 # 发送 SIGHUP 信号(常用于重载配置)
kill -l # 列出所有信号
kill -STOP 1234 # 暂停进程
kill -CONT 1234 # 恢复进程
kill $(pgrep nginx) # 终止所有 nginx 进程(配合 pgrep)NOTE
- 进程无法捕获或忽略
SIGKILL,可能导致数据丢失。 - 优先尝试
SIGTERM(-15),给进程清理资源的机会。
pkill - 批量终止进程
pkill 是 kill 的增强版,允许通过 进程名、用户、终端等条件 批量终止进程,无需手动查找 PID。
语法格式
pkill [选项] <模式>选项
| 选项 | 说明 |
|---|---|
-f | 匹配完整命令行(而不仅是进程名) |
-u | 按用户名匹配 |
-t | 按终端匹配(如 pts/0) |
-x | 精确匹配进程名 |
-n | 只杀最新的匹配进程 |
-o | 只杀最旧的匹配进程 |
-c | 统计匹配的进程数(不实际终止) |
-l | 显示进程名(配合 -c 使用) |
经典案例
pkill -f "python" # 终止命令行包含 "python3" 的进程
pkill nginx # 终止所有名为 "nginx" 的进程
pkill -u root # 终止 root 用户的所有进程
pkill -u bob,alice # 终止多个用户的进程
pkill -t pts/1 # 终止来自终端 pts/1 的进程
pkill -9 nginx # 强制终止(SIGKILL)
pkill -15 python # 优雅终止(SIGTERM,默认)
pkill -STOP vim # 暂停进程(SIGSTOP)
pkill -CONT vim # 恢复进程(SIGCONT)
pkill -u bob -t pts/2 # 终止某用户的 SSH 会话注意事项
SIGKILL(-9)是最后的强制手段
pkill - 按名称终止进程
pkill命令通过进程名称或其他属性匹配并终止进程,是kill命令的扩展。
语法格式
pkill [选项] 模式常用选项
| 选项 | 说明 |
|---|---|
-u 用户名 | 只终止指定用户的进程 |
-t 终端 | 只终止指定终端的进程 |
-f | 匹配完整命令行 |
-n | 只终止最新的进程 |
-o | 只终止最旧的进程 |
经典案例
pkill nginx # 终止所有名为nginx的进程
pkill -u user1 # 终止用户user1的所有进程
pkill -f "python script.py" # 终止特定的python进程killall - 按进程名批量终止进程
killall 用于 按进程名批量终止进程(精确匹配),比 kill 更方便,但比 pkill 功能简单。
语法格式
killall [选项] <进程名>选项
| 选项 | 说明 |
|---|---|
-e | 精确匹配进程名(默认) |
-I | 忽略大小写 |
-i | 交互式终止(询问确认) |
-r | 使用正则表达式匹配(类似 pkill) |
-s | 指定信号(如 -s 9 或 -s KILL) |
-v | 显示详细信息(哪些进程被终止) |
-w | 等待所有进程终止后再返回 |
经典案例
killall nginx # 终止所有名为 "nginx" 的进程
killall -9 python # 强制终止所有 Python 进程
killall -u root # 终止 root 用户的所有进程
killall -u bob # 终止用户 bob 的所有进程
killall -15 nginx # 优雅终止(SIGTERM,默认)
killall -9 vim # 强制终止(SIGKILL)
killall -STOP bash # 暂停所有 Bash 进程
killall -CONT bash # 恢复所有 Bash 进程
kill -1 5678 # 发送 SIGHUP,常用于重启守护进程(如 Nginx)
kill -19 1234 # 暂停 PID 1234(SIGSTOP)
kill -18 1234 # 恢复 PID 1234(SIGCONT)
kill 1234 5678 # 同时终止 PID 1234 和 5678
pkill nginx # 终止所有名为 "nginx" 的进程
killall -9 python # 强制终止所有 Python 进程
kill -9 $(ps -u username -o pid) # 强制终止某用户的所有进程
kill -9 $(ps -A -ostat,ppid | awk '/[Zz]/ {print $2}') # 终止僵尸进程的父进程systemctl - 系统和服务管理器
systemd 是 Linux 系统的新型初始化系统和服务管理器,取代传统的 SysVinit。它提供:
- 并行启动服务
- 按需激活守护进程
- 快照和系统状态恢复
- 依赖关系管理
语法格式
systemctl [OPTIONS] COMMAND [UNIT...]主要命令
| 命令 | 作用 |
|---|---|
systemctl start <服务名> | 启动服务(立即生效) |
systemctl stop <服务名> | 停止服务 |
systemctl restart <服务名> | 重启服务 |
systemctl reload <服务名> | 重新加载配置(不重启服务) |
systemctl status <服务名> | 查看服务状态(运行/失败/日志) |
systemctl enable <服务名> | 开机自启 |
systemctl disable <服务名> | 开机不自启 |
systemctl is-active <服务名> | 检查服务是否正在运行 |
systemctl is-enabled <服务名> | 检查服务是否开机自启 |
systemctl enable --now <服务名> | 开机自启,并立即启动 |
systemctl disable --now <服务名> | 开机不自启,并立即关 |
systemctl status | 系统管理 |
journalctl -u <服务名> | 日志管理 |
journalctl | 查看系统日志 |
经典案例
systemctl status nginx # 查看服务状态
systemctl enable docker # 设置开机启动
systemctl enable docker --now # 设置开机启动并立即启动
systemctl start sshd # 启动服务
systemctl stop apache2 # 停止服务
systemctl restart mysql # 重启服务注意事项
- 配置文件路径:
- 系统服务:
/etc/systemd/system/ - 用户服务:
~/.config/systemd/user/
- 系统服务:
- 修改配置后需要重载:
systemctl daemon-reload - 查看日志
journalctl -u service_name - 不同发行版差异:
- Ubuntu 16.04+ 默认使用
- CentOS 7+ 默认使用
- 旧版系统可能需要手动安装
journalctl - 查询 systemd 日志
journalctl 是 systemd 提供的日志管理工具,用于查看和分析系统日志。它替代了传统的 syslog,并提供了更强大的日志过滤、搜索和格式化功能。
语法格式
journalctl [OPTIONS] [MATCHES...]选项
| 选项 | 说明 |
|---|---|
-u UNIT | 查看指定服务的日志 |
-b | 查看本次启动的日志 |
-f | 实时跟踪日志(类似 tail -f) |
-n NUM | 显示最近的 NUM 条日志 |
-k | 仅显示内核日志 |
--since "YYYY-MM-DD HH:MM:SS" | 查看指定时间之后的日志 |
--until "YYYY-MM-DD HH:MM:SS" | 查看指定时间之前的日志 |
-p PRIORITY | 按日志级别过滤(如 emerg, alert, crit, err, warning, notice, info, debug) |
-o json | 以 JSON 格式输出日志 |
--no-pager | 直接输出(不进入分页模式) |
经典案例
journalctl # 查看所有日志
journalctl -u nginx # 查看特定服务的日志
journalctl -f # 实时跟踪日志(类似 tail -f)
journalctl -n 50 # 查看最近 50 条日志
journalctl -b # 查看本次启动的日志
journalctl -p err # 查看错误级别的日志
journalctl --since "2023-10-01 00:00:00" --until "2023-10-02 23:59:59" # 查看特定时间段的日志
journalctl -k # 查看内核日志
journalctl _PID=1234 # 查看某个进程的日志
journalctl -u sshd --no-pager > sshd.log #导出日志到文件注意事项
权限要求:
普通用户只能查看自己的日志。
使用
sudo查看系统日志:
bashsudo journalctl
日志存储位置:
- 默认存储在
/var/log/journal/(如果存在)。 - 如果未启用持久化存储,重启后日志会丢失。
- 默认存储在
启用持久化存储:
bashsudo mkdir -p /var/log/journal sudo systemd-tmpfiles --create --prefix /var/log/journal sudo systemctl restart systemd-journald日志大小限制:
默认限制在
/etc/systemd/journald.conf中配置:iniSystemMaxUse=500M RuntimeMaxUse=100M
nohup - 后台持久运行命令
命令简介
nohup(no hang up)用于在用户注销后仍保持命令运行,防止进程收到SIGHUP信号终止,常与&配合使用实现后台运行。
语法格式
nohup 命令 [参数] &经典案例
# 基础后台运行(输出重定向到nohup.out)
nohup python app.py &
# 自定义输出文件
nohup ./server.sh > server.log 2>&1 &
# 忽略所有输出
nohup command > /dev/null 2>&1 &
# 配合timeout运行
nohup timeout 24h ./batch_process.sh &
# 查看运行中的nohup作业
jobs -l注意事项
- 默认输出重定向到
nohup.out文件 - 退出终端前建议用
disown移除作业 - 对于重要服务,建议使用
systemd或screen替代 - 可通过
ps -ef | grep 命令查看运行状态
jobs - 作业控制管理命令
命令简介
jobs 是 Shell 内置命令,用于查看和管理当前 Shell 会话中的后台作业(background jobs)。这些作业通常是通过在命令末尾添加 & 符号或使用 Ctrl+Z 挂起的任务。
语法格式
jobs [选项] [作业标识符]常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-l | 显示作业的 PID | jobs -l |
-p | 仅显示作业的进程组 ID | jobs -p |
-n | 仅显示上次通知后有状态改变的作业 | jobs -n |
-r | 仅显示运行中的作业 | jobs -r |
-s | 仅显示已停止的作业 | jobs -s |
作业标识符
| 标识符 | 描述 | 示例 |
|---|---|---|
%n | 作业号 n | fg %1 |
%str | 以 str 开头的作业 | kill %python |
%?str | 包含 str 的作业 | bg %?script |
%% 或 %+ | 当前作业 | kill %% |
%- | 前一个作业 | fg %- |
经典案例
# 启动后台作业
sleep 60 &
python script.py &
# 查看所有作业
jobs -l
# 输出示例:[1] - 12345 running sleep 60
# [2] + 12346 running python script.py
# 将作业调到前台
fg %1
# 继续运行被挂起的作业
bg %2
# 终止特定作业
kill %?script
# 仅显示运行中的作业
jobs -r
# 显示作业的进程ID
jobs -p %1
# 启动并立即disown作业
python long_running.py &!
# 等待特定作业完成
wait %1
# 复杂作业控制
(sleep 10; echo Done) & # 启动子Shell作业
jobs -l # 查看作业状态相关命令
- Ctrl+Z - 挂起当前前台作业
- bg - 将挂起的作业转为后台运行
- fg - 将后台作业调至前台
- disown - 从作业表中移除作业
- wait - 等待作业完成
注意事项
- 作业控制是 Shell 的功能,不同 Shell(bash、zsh 等)可能有细微差异
- 退出终端会导致作业终止(除非使用
nohup或disown) - 作业号在每次 Shell 启动时重新计数
- 使用
&|或&!(zsh)可以立即 disown 一个作业
jobs 命令是 Shell 作业控制的核心工具,合理使用可以有效地管理多个并发任务,特别适用于需要同时处理多个耗时操作的场景。
lsof - 列出打开进程
命令简介
lsof(list open files)显示系统打开的文件列表,实质可查看:
- 常规文件
- 目录
- 网络连接
- 设备文件
- Unix域套接字
常用选项
| 选项 | 描述 | 示例 |
|---|---|---|
-i | 网络连接 | lsof -i :80 |
-p | 指定进程 | lsof -p 1234 |
-u | 指定用户 | lsof -u root |
-c | 命令匹配 | lsof -c nginx |
+d | 目录文件 | lsof +d /var/log |
-t | 仅显示PID | lsof -t /var/lock/file.lock |
经典案例
# 查看端口占用
lsof -i :22
# 查看进程打开的文件
lsof -p $(pidof nginx)
# 查找删除但未释放的文件
lsof /var/log/ | grep deleted
# 查看用户活动
lsof -u www-data
# 恢复被删除的文件(通过/proc)
ls -l /proc/$(lsof -t /path/to/file)/fd/系统管理应用
# 强制释放占用文件的进程
kill -9 $(lsof -t /mountpoint)
# 检查异常网络连接
lsof -i -n -P
# 查看SSH连接来源
lsof -i | grep sshdservice - 系统服务管理
命令简介
service是SysV初始化系统的服务管理工具,用于启动/停止系统服务。现代系统通常使用systemctl替代,但仍兼容此命令。
语法格式
service 服务名 操作常用操作
| 操作 | 描述 | 示例 |
|---|---|---|
| start | 启动服务 | service nginx start |
| stop | 停止服务 | service mysql stop |
| restart | 重启服务 | service ssh restart |
| reload | 重载配置 | service haproxy reload |
| status | 服务状态 | service docker status |
经典案例
# 查看所有服务状态
service --status-all
# 带详细日志重启
service apache2 restart -v
# 测试新配置(不实际重载)
service nginx configtest
# 传统服务管理(等价于)
/etc/init.d/nginx restart注意事项
- 在systemd系统中实际调用的是
systemctl的兼容接口 - 对于新服务建议直接使用
systemctl - 不同发行版的服务脚本位置可能不同(/etc/init.d/)
- 可通过
chkconfig或update-rc.d管理启动项
现代替代方案
# systemd标准用法
systemctl start nginx
systemctl enable docker
# 查看服务日志
journalctl -u nginx这三个命令分别代表了Linux系统管理的三个重要方面:进程持久化、资源监控和服务控制,是系统管理员日常故障排查和维护的基础工具。
