Shell脚本学习指南-第十三章-进程
第13章 进程
背景:进程是正在运行程序的实例;内核通过时间片轮转实现多进程假象,调度器负责调度。本章聚焦 shell 脚本日常实操:查看进程、信号控制、trap捕获、系统调用追踪、任务调度、/proc虚拟文件。
13.1 进程建立
概念
新进程依靠内核系统调用 fork()、execve() 创建;进程调用 exit() 结束。
shell 执行外部命令就会创建新进程。
shell启动的进程自带特性
- 内核上下文:内核保存进程管理信息
- 私有虚拟地址空间:进程之间内存互相隔离,互不干扰
- 默认打开3个文件描述符:标准输入、标准输出、标准错误
- 交互终端启动的进程拥有控制终端,可以接收键盘信号(Ctrl‑C等)
- shell提前完成通配符展开,程序不需要自己处理
- 自带环境变量区域,程序可读取环境变量
配套命令
uptime:查看系统平均负载,输出1分钟、5分钟、15分钟负载nice / renice:修改进程运行优先级
示例
13.2 进程列表
1.ps 查看进程
ps 两大流派:System‑V、BSD,很多系统两者都支持。
| 流派 | 命令 | 说明 |
|---|---|---|
| System‑V | ps -efl |
完整长格式输出 |
| BSD | ps aux |
常用,显示CPU、内存占用 |
关键字段
PID:进程唯一ID;shell变量$$获取当前脚本PIDPPID:父进程ID;父进程退出,孤儿进程会被 PID=1(init)收养USER/UID:进程所属用户%CPU / %MEM:CPU、内存占用COMMAND:执行的命令
2.top 动态实时监控进程
- 默认按CPU占用从高到低排序,实时刷新
- 可以按
?查看top内置快捷键
shell作业控制(交互终端)
| 命令 | 作用 |
|---|---|
命令 & |
后台运行进程 |
jobs |
查看当前shell后台作业 |
fg %编号 |
后台进程切到前台 |
bg %编号 |
暂停进程放到后台继续跑 |
wait |
等待后台进程结束;wait PID等待指定进程 |
前台进程快捷键
Ctrl‑C:INT信号,终止程序Ctrl‑Z:SUSP信号,暂停程序Ctrl‑\:QUIT,终止并生成core转储文件
示例脚本1:simple‑top(简易top)
原理:死循环,重复执行ps、排序、sleep休眠,模拟top效果
|
|
示例脚本2:puser,按用户统计进程数量
管道链路:ps输出 → sed去掉表头 → egrep过滤用户 → sort排序 → uniq计数 → awk格式化输出
|
|
使用
13.3 进程控制与删除(信号signal)
基础概念
kill:不是直接杀死进程,是发送信号给进程。
进程可以捕获、忽略大部分信号;仅有两个信号无法捕获:KILL、STOP。
查看系统全部信号
|
|
常用信号清单
| 信号 | 作用 |
|---|---|
TERM |
kill不带参数默认信号;优雅终止,程序做清理工作 |
HUP |
挂断;守护进程收到,通常重读配置文件 |
KILL |
强制杀死,终极手段,无法捕获,跳过清理逻辑 |
STOP |
暂停进程,无法捕获;CONT恢复被暂停进程 |
USR1 / USR2 |
用户自定义信号,程序自己定义行为 |
最佳实践关闭失控进程:
kill -HUP PID→kill -TERM PID→ 万不得已才用kill -KILL PID
按进程名操作
pgrep 进程名:按名字查找PIDpkill 信号 进程名:按名字发信号;风险:进程名不唯一,容易误杀别的进程
示例
shell trap:脚本捕获信号
语法:trap '要执行的命令' 信号名
特殊伪信号
EXIT:脚本退出时一定执行,最常用,用来清理临时文件DEBUG:每条命令执行前后触发,不同shell行为不一致,不要写可移植脚本用它ERR:命令非0退出触发;命令替换失败不会触发,兼容性差
示例脚本 looper
后台运行测试
注意:优先使用信号名字,不要用数字编号,可移植性更好。
13.4 系统调用追踪
作用
不依赖源代码,跟踪程序每一条内核系统调用(open/fork/execve/unlink等);排查:程序找哪些配置文件、卡死原因、残留锁文件。
各平台工具
| 系统 | 追踪工具 |
|---|---|
| Linux | strace |
| Solaris | truss |
| BSD/macOS | ktrace + kdump |
示例 Linux strace
典型使用场景:查找程序残留lock锁文件
13.5 进程记账 process accounting
- 默认关闭;内核记录每一个进程结束后的资源消耗(CPU、运行时间)
- 二进制日志文件,需要专用工具解析
- 工具:
acctcom、lastcomm、sa
示例
|
|
13.6 延迟进程调度
1.sleep:休眠一段时间
休眠进程几乎不消耗CPU;脚本循环延时、等待场景大量使用。
|
|
2.at:一次性未来某个时刻执行任务
| 命令 | 说明 |
|---|---|
at 21:00 < cmdfile |
晚上21点执行文件内命令 |
at now + 10 minutes < cmdfile |
10分钟后执行 |
atq |
查看at任务队列 |
atrm 任务编号 |
删除at任务 |
示例:准备命令文件 cmdfile,新建文件 cmdfile,里面写要跑的命令:
权限文件:
/etc/at.allow:写在这里的用户,才允许用 at/etc/at.deny:写在这里的用户禁止使用 at- 如果两个文件都不存在,只有 root 可以使用 at。
3.batch:系统空闲时执行任务
系统负载低的时候才跑任务,读取标准输入的命令
|
|
batch 与 at 的对比
| 命令 | 触发条件 | 适合场景 |
|---|---|---|
at 21:00 < file |
固定时刻执行一次 | 明确知道几点跑,比如今晚 21 点备份 |
batch < file |
系统负载低于阈值才执行 | 非紧急、耗 CPU 的任务;希望不打扰用户交互;不知道什么时候有空 |
4.crontab:周期性定时任务
守护进程 cron,循环执行定时任务。
操作命令
crontab -l:列出当前用户定时任务crontab -e:编辑定时任务crontab -r:全部删除定时任务(不可恢复,建议先备份)
crontab格式
示例
工程建议:crontab只调用shell脚本,业务逻辑写在脚本内部,方便维护。
权限控制文件:cron.allow/cron.deny
备份crontab
|
|
13.7 /proc 虚拟文件系统(Linux为主)
不是真实磁盘文件;读取时内核实时生成数据,文件大小显示为0。
目录结构
/proc/PID:每个进程一个目录,PID为目录名/proc/PID/cmdline:进程启动命令/proc/PID/fd:进程打开的所有文件描述符/proc/PID/status:进程状态信息
/proc/meminfo:内存信息/proc/cpuinfo:CPU硬件信息
示例
注意:不要直接scp/tar拷贝/proc下文件,会异常。
13.8 本章小结
- 进程拥有独立私有地址空间;shell外部命令依靠
fork/exec创建子进程。 - 终止进程优先优雅信号
TERM,KILL是最后手段,会跳过程序清理,容易残留锁文件。 - shell脚本使用
trap EXIT,脚本退出自动做资源清理,提升健壮性。KILL、STOP无法被捕获。 - 排查程序行为,系统调用追踪工具
strace/truss非常实用,不需要源代码。 - 任务调度
sleep:短暂延时at:一次性未来时刻crontab:周期重复执行
/proc虚拟文件系统,以文件接口直接读取内核的进程、硬件信息。
文章作者 会写代码的小郎中
上次更新 2011-07-26
许可协议 CC BY-NC-ND 4.0