进程管理
进程管理
复习定位
Linux系统中同时运行许多进程——需要工具查看和管理它们。ps列出进程的状态和资源使用情况——kill向进程发送信号——作业控制管理一个Shell中的前后台任务。对于系统管理员审查哪个进程消耗过多CPU/内存而结束是高优先级的排障技能。
ps命令
ps aux显示系统中所有进程的详细信息**:
| 字段 | 含义 |
|---|---|
| USER | 进程的所有者 |
| PID | 进程ID——可以唯一标识进程 |
| %CPU | CPU使用率——(CPU时间/经过的时间)×100% |
| %MEM | 物理内存使用率(RSS/总内存×100%) |
| VSZ | 虚拟内存大小(KB)——包括未实际分配的页 |
| RSS | 常驻内存大小(KB)——物理内存的实际占用 |
| STAT | 进程状态码 |
| START | 进程启动时间 |
| TIME | 进程累计的CPU占用时间 |
| COMMAND | 命令名和参数 |
进程状态码(STAT):
- R——正在运行或就绪(运行队列中)
- S——进入可中断睡眠(等待某事件发生)
- D——不可中断睡眠(通常等待磁盘I/O)——此进程不能被信号终止
- T——已停止(如被Ctrl+Z暂停或ptrace跟踪)
- Z——僵尸——进程已退出但父进程未wait回收
ps -ef——以标准格式显示所有进程——经常和管道配合ps -ef | grep nginx。
top——实时的进程监控工具。每几秒刷新一次——按CPU使用率排序——可以按M按内存排序、按P按CPU排序、按1显示各核分布。top输出中也包括系统的总体信息(运行时长/用户数/负载均值)。
htop——更友好的top替代——彩色显示、可鼠标操作、树状进程图——但通常需要单独安装。
kill——向进程发送信号
kill [-signal] PID。kill不是结束进程——而是发送一个信号给进程。信号是软件中断。常见信号:
| 信号 | 编号 | 默认动作 | 说明 |
|---|---|---|---|
| SIGHUP | 1 | 终止 | 终端挂断或进程退出时发给子进程——守护程序常用作重载配置 |
| SIGINT | 2 | 终止 | Ctrl+C——中断 |
| SIGQUIT | 3 | 终止+core | Ctrl+\——退出及产生core文件 |
| SIGKILL | 9 | 终止(不可捕获) | 强制终止——不可被进程忽略 |
| SIGTERM | 15 | 终止(可捕获) | 默认kill信号——请求进程自行清理 |
| SIGSTOP | 19 | 暂停(不可捕获) | Ctrl+Z——暂停进程 |
| SIGCONT | 18 | 继续 | 让暂停的进程恢复执行 |
kill -9 PID强制杀死——但进程没有机会做任何善后处理(关闭文件、释放锁)。kill -15 PID(默认)先礼貌地请求进程退出——进程可以捕获SIGTERM在退出前执行清理。
pkill name——按进程名发送信号(pkill -9 firefox)。killall name——杀死所有同名进程。
作业控制(前台和后台)
当在终端中运行一个命令时——默认是在前台运行——Shell会等待它结束才接受下一个输入。在命令末尾添加&可将命令放在后台运行——sleep 100 &——Shell会显示作业号和PID并提示后台任务在运行时继续接受输入。
jobs——列出当前Shell的所有作业及其状态。输出[1]+ Running sleep 100 &。
fg %1——将作业1调到前台继续运行。bg %1——将暂停的作业1转到后台继续运行。Ctrl+Z暂停前台作业。
nohup——使命令忽略SIGHUP信号——关闭终端后进程继续运行。nohup long_running_command &。stderr和stdout默认输出到nohup.out。
复习检查
ps aux中的VSZ和RSS——如果RSS远小于VSZ差别可能的含义——进程申请了大量的虚拟内存但未实际使用——如分配了大数组但未访问。
一个进程的STAT显示为D(不可中断睡眠)——什么情况下一个进程进入这个状态——为什么kill -9对它无效——可能需要什么额外操作(修复磁盘或重启应用)?
kill -9和kill -15的区别——应该优先用哪一个(15)——给进程机会进行善后——强制结束时可能造成文件损坏(因为没有刷新缓冲区)。
Ctrl+Z暂停一个过程到后台——然后
bg让它继续在后台运行——此后Shell会继续等待该后台任务吗——如何重新将它挂回前台控制?nohup和disown的区别——nohup让进程忽略SIGHUP线信号——disown将进程从Shell的作业表中移除——当Shell退出时——nohup的任务不会收到SIGHUP关闭信号——而disown后的任务直接与Shell脱钩——后者不会在shell退出后接收任何信号。