概述
参考文档:Linux man-pages
进程是运行中的程序实例,内核给每个进程一个 PID、一组状态与一张打开文件表,本篇的命令都在读或改这三样东西
命令地图:
flowchart LR A{"要做什么"} -->|"看进程"| B["ps pgrep pstree"] A -->|"结束进程"| C["kill pkill killall"] A -->|"查占用"| D["lsof fuser"] A -->|"调优先级"| E["nice renice"] A -->|"深挖单个"| F["/proc/PID"]
快速开始
console
$ ps aux | rg nginx # 找进程
$ pgrep -a nginx # 按名字找 PID 并显示完整命令行
$ kill 1234 # 发默认信号 SIGTERM
$ lsof -i :443 # 谁在用 443 端口
查看进程
ps有两套选项风格,不要混搭:- BSD 风:
ps aux,a所有终端进程、u用户友好格式、x连无终端的进程,日常用这套 - System V 风:
ps -ef,信息量等价,老脚本里常见
- BSD 风:
ps aux的列:%CPU与%MEM占用、VSZ虚拟内存(KB)、RSS常驻内存(KB)、STAT状态、TIME累计 CPU 时间STAT状态码:R运行或就绪、S可中断睡眠、Z僵尸(已退出待父进程收尸)、T暂停D不可中断睡眠,通常在等 IO,这种状态连kill -9都无效,只能等 IO 返回或重启- 后缀:
s会话首进程、l多线程、+前台进程组、<高优先级、N低优先级
- 自定义输出与排序:
ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head看吃 CPU 前几名 pgrep与pkill共用一套过滤条件:-l附带名字,-a附带完整命令行,-u user限定用户,-t tty限定终端-f匹配整条命令行而不只是程序名-o最老的、-n最新的、-P 父PID某进程的直接子进程
pidof nginx精确按程序名取 PID,pstree -p看进程树确认父子关系
信号与结束进程
kill的本质是发信号,kill -l列出全部,常用的就这几个:SIGTERM(15):默认信号,进程可以捕获并清理后退出,先发它SIGKILL(9):内核直接回收,进程无法捕获,数据可能损坏,是最后手段SIGINT(2):就是终端里的Ctrl+CSIGHUP(1):挂断信号,守护进程惯例用它当"重读配置"用SIGSTOP与SIGCONT:暂停与继续,Ctrl+Z发的是SIGTSTP
- 标准姿势:
kill PID,等几秒确认没死,再kill -9 PID killall按进程名精确匹配发送,pkill按正则模式发送,pkill -f的匹配面覆盖整条命令行,误伤风险最大:- 在 ssh 会话里
pkill -f ssh会连自己的会话一起杀掉
- 在 ssh 会话里
- 指定信号可用数字
-9也可用名字-KILL,脚本里用名字更可读
lsof
lsof列出打开的文件,Linux 下"文件"包括普通文件、目录、管道与 socket,所以端口占用也归它管按端口与网络查:
console$ lsof -i :22 # 22 端口相关的所有连接 $ lsof -i TCP -sTCP:LISTEN # 所有 TCP 监听 $ lsof -i -P -n # 禁用端口与主机名解析,快很多其它维度:
-p PID某进程打开的全部文件、-u user某用户、+D /path目录下被打开的文件经典场景:
umount报target is busy:lsof +D 挂载点揪出占用者- 磁盘满了但
du找不到大文件:lsof | rg deleted,文件已删但进程还握着句柄,空间不释放,重启对应进程即可 - 只取 PID 用于脚本:
kill -9 $(lsof -t -i:8080),-t只输出 PID
fuser是同功能的另一把刀:fuser -v 8080/tcp看占用某端口的进程
优先级与后台
- nice 值范围
-20(最高)到19(最低),默认0:- 普通用户只能降低优先级(数值调大),负值需要 root
- 启动时指定:
nice -n 10 命令,运行中调整:renice -n 5 -p PID
- 后台运行与脱离终端:
命令 &挂后台,jobs、fg、bg管理,退出登录时会收到SIGHUPnohup 命令 &让进程免疫挂断信号,输出默认进nohup.outsetsid开新会话彻底脱离终端,disown把已在跑的作业移出挂断名单
- 长期任务推荐直接写成 systemd 服务或 timer,交给
systemctl托管,见systemd、systemctl 与 journalctl
/proc
/proc/PID/是内核暴露的进程档案,ps与top的数据源头就在这里:cmdline:完整命令行,参数以\0分隔:tr '\0' ' ' < /proc/PID/cmdlineenviron:环境变量,同样\0分隔status:人读的状态汇总,含线程数与上下文切换次数fd/:每个打开的句柄一个符号链接,ls -l /proc/PID/fdlimits:文件句柄数等资源上限
- 数字目录随进程生死增减,配合
watch即可做极简监控
相关阅读
- 监控操作系统:top 与系统级监控视角
- Go 调度器(GMP):Go 的 M 在这里就是一个普通线程
- 操作系统的进程管理:状态与调度的理论侧