目录
理论学习
1. 进程状态全解析
进程是操作系统资源分配的最小单位,其状态反映了它在生命周期中的不同阶段。Linux通过状态码精确描述进程行为:
- R (Running/Runnable, 运行/可运行)
- 定义:进程正在CPU上执行,或位于就绪队列中等待CPU时间片。
- 细节:
- 用户空间程序通常处于
TASK_RUNNING
状态。 - 内核线程也可能显示为R,但无用户空间上下文。
- 用户空间程序通常处于
- S (Interruptible Sleep, 可中断睡眠)
- 定义:进程主动放弃CPU,等待某个事件(如I/O完成、信号接收)。
- 触发场景:
- 执行
read()
系统调用等待磁盘数据。 - 调用
sleep()
暂停执行。 - 等待用户输入(如
getchar()
)。
- 执行
- 特性:收到信号(如
SIGTERM
)会立即唤醒。
- Z (Zombie, 僵尸进程)
- 定义:进程已终止,但父进程未通过
wait()
或waitpid()
回收其资源。 - 危害:长期存在的僵尸进程会耗尽进程表条目,导致系统无法创建新进程。
- 解决方法:
- 杀死父进程(僵尸进程会被init进程接管并回收)。
- 在父进程中添加信号处理函数,响应
SIGCHLD
信号并回收子进程。
- 定义:进程已终止,但父进程未通过
- D (Uninterruptible Sleep, 不可中断睡眠)
- 定义:进程在等待某些仅能由内核处理的I/O操作(如直接磁盘访问)。
- 特点:即使收到
SIGKILL
信号也无法被终止,必须等待操作完成。 - 常见场景:
- NFS文件系统挂载失败导致的进程挂起。
- 硬件故障时的I/O阻塞。
- T (Stopped, 暂停)
- 定义:进程被暂停执行,通常由信号触发。
- 触发信号:
SIGSTOP
(kill -STOP <PID>
):手动暂停进程。SIGTSTP
(Ctrl+Z
):在终端中暂停前台进程。
- 恢复:通过
SIGCONT
(kill -CONT <PID>
)继续执行。
- X (Dead, 死亡)
- 定义:进程已终止,但尚未从进程表中完全删除。
- 生命周期:短暂状态,通常仅在进程终止后立即可见。
2. systemctl
命令进阶
systemctl
是Systemd系统和服务管理器的核心工具,提供全面的系统和服务控制功能:
- 基本命令:
systemctl start apache2
:启动服务(若服务未安装会报错)。systemctl stop apache2
:立即停止服务(可能中断用户连接)。systemctl restart apache2
:重启服务(先停止再启动,适用于配置更新)。systemctl reload apache2
:重新加载配置文件(不中断服务,需服务支持)。systemctl enable apache2
:设置开机自启(创建符号链接到/etc/systemd/system/multi-user.target.wants/
)。systemctl disable apache2
:取消开机自启(删除符号链接)。systemctl status apache2
:查看服务状态(包括运行时间、最近日志、监听端口等)。systemctl is-active apache2
:检查服务是否活跃。systemctl is-enabled apache2
:检查是否开机自启。
- 高级功能:
- 查看服务依赖:
bash
systemctl list-dependencies apache2
- 屏蔽服务(防止意外启动):
bash
systemctl mask apache2 # 创建符号链接到/dev/null
systemctl unmask apache2 # 取消屏蔽
- 编辑服务单元文件:
bash
systemctl edit apache2 # 创建/etc/systemd/system/apache2.service.d/override.conf
- 查看服务依赖:
实操演练
1. 监控资源:htop
高级用法
- 安装与运行:
bash
sudo apt update && sudo apt install htop -y
htop
- 界面导航:
- F2 (Setup):自定义显示列、颜色、排序方式。
- F3 (Search):按进程名或PID搜索。
- F4 (Filter):过滤进程(如仅显示用户进程)。
- F5 (Tree):以树形结构显示进程层级。
- F6 (SortBy):按CPU、内存、时间等排序。
- F7/F8 (Nice):调整进程优先级(需权限)。
- F9 (Kill):发送信号终止进程。
- F10 (Quit):退出
htop
。
2. 后台运行:nohup
与 &
深入
- 命令详解:
bash
nohup python3 -m http.server 8000 &
&
:将命令放入后台执行,释放终端。nohup
:忽略SIGHUP
信号,确保终端关闭后进程仍运行。- 输出重定向:默认保存到
nohup.out
,可用>
重定向:bash
nohup python3 -m http.server 8000 > server.log 2>&1 &
- 后台进程管理:
- 查看进程:
bash
jobs -l # 查看当前会话的后台任务
ps aux | grep python3 # 通过进程名查找
- 恢复前台:
bash
fg %1 # 将编号为1的后台任务恢复到前台
- 终止进程:
bash
kill %1 # 终止编号为1的后台任务
- 查看进程:
3. 服务管理:Apache 深度操作
- 查看服务状态:
bash
systemctl status apache2
- 输出解析:
Loaded
: 服务单元文件路径及是否开机自启。Active
: 服务当前状态(active (running)
表示运行中)。Main PID
: 主进程PID。Tasks
: 进程数(仅限使用TaskMax
的服务)。Memory
: 内存占用。CGroup
: 控制组信息(资源限制)。Logs
: 最近日志条目(通常来自journalctl
)。
- 输出解析:
- 重启服务:
bash
systemctl restart apache2
- 场景:修改配置文件后需重启生效(如修改虚拟主机配置)。
- 注意事项:重启会短暂中断服务,确保在低峰时段操作。
- 查看服务日志:
bash
journalctl -u apache2 --since "10 minutes ago"
- 参数说明:
-u apache2
: 指定服务单元。--since "10 minutes ago"
: 显示最近10分钟的日志。--follow
: 实时跟踪日志(类似tail -f
)。-b
: 显示本次启动以来的日志。-p err
: 仅显示错误级别日志。
- 参数说明:
- 配置服务端口:
- 编辑配置文件:
bash
sudo systemctl edit apache2 # 创建覆盖配置文件
- 添加端口绑定:
ini
[Service]
Environment="APACHE_LISTEN_PORTS=80 8080"
- 重启服务:
bash
sudo systemctl daemon-reload # 重新加载配置
sudo systemctl restart apache2
- 编辑配置文件:
- 处理服务启动失败:
- 查看状态:
bash
systemctl status apache2
- 检查日志:
bash
journalctl -u apache2 -b --no-pager
- 常见原因:
- 端口冲突(使用
netstat -tulpn | grep :80
检查)。 - 配置文件语法错误(使用
apachectl configtest
验证)。 - 依赖服务未启动(如
systemctl is-enabled mysql
)。
- 端口冲突(使用
- 查看状态:
复习巩固:绘制进程状态图
1. 工具选择:Draw.io 深度使用
- 访问地址:
- 创建图表:
- 选择“空白图表”或“流程图”模板。
- 从左侧工具栏拖拽形状到画布。
2. 状态图设计步骤
- 添加状态节点:
- 使用圆形或椭圆形表示状态(R、S、Z、D、T)。
- 双击节点输入状态名称。
- 绘制转换箭头:
- 使用箭头工具连接状态节点。
- 双击箭头输入触发条件(如“
kill -STOP
”、“I/O完成”)。
- 标注状态特性:
- 在状态节点旁添加文本框,描述状态行为(如“等待事件”、“不可中断”)。
- 示例图结构:
[R] <--> [S] (等待事件/信号唤醒)
↑ ↓
[T] ← 暂停信号 [D] (硬件I/O阻塞)
↓ ↑
[Z] ← 进程终止 [父进程wait()]
3. 高级技巧:
- 使用图层:将状态和箭头分组到不同图层,便于管理。
- 添加样式:自定义颜色、字体、边框,提高可读性。
- 导出图表:支持PNG、SVG、PDF等多种格式,方便分享和嵌入文档。