进程是什么
每个跑着的程序 = 一个进程。每个进程有:
- PID(Process ID):唯一编号
- PPID(Parent PID):谁启动了它
- UID:以哪个用户身份在跑
- 状态:跑(R)、睡(S)、僵尸(Z)等
ps:看进程快照
ps # 看当前 shell 里的进程
ps -ef # 全系统所有进程(System V 风格)
ps aux # 全系统所有进程(BSD 风格,更常用)
ps aux | grep nginx # 找 nginx 相关进程
ps -ef --forest # 树状显示父子关系
ps aux 输出列:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
wadely 1234 0.1 0.5 21424 5680 pts/0 Ss 10:23 0:00 -bash
- VSZ:虚拟内存(不真占用)
- RSS:实际占用物理内存(关心这个)
- STAT:状态(R=running, S=sleep, Z=zombie, D=disk wait)
top / htop:实时监控
top # 系统自带,实时
操作快捷键:
q退出M按内存排序P按 CPU 排序k杀进程1显示每个核c显示完整命令
htop # 更友好的 top(需要装:sudo apt install htop)
htop 操作:
- 方向键选进程
F9杀进程F5树状视图/搜索F4过滤
服务器上优先装 htop——top 默认但难用。
kill:发信号给进程
kill 1234 # 发 SIGTERM(15,温柔结束)
kill -9 1234 # 发 SIGKILL(9,强制结束,不能挡)
kill -HUP 1234 # 发 SIGHUP(1,重载配置)
kill -l # 看所有信号
常用信号:
| 信号 | 数字 | 含义 |
|---|---|---|
SIGTERM |
15 | 温和结束(默认)—— 让程序自己清理后退出 |
SIGKILL |
9 | 强制结束 —— 内核直接杀,不可阻挡 |
SIGHUP |
1 | 挂起 —— 很多服务用它做"重载配置" |
SIGINT |
2 | 中断 —— 等同 Ctrl+C |
SIGSTOP |
19 | 暂停 —— 不能阻挡 |
SIGCONT |
18 | 继续 |
优先用
kill(15),实在不响应再kill -9。强杀可能让程序留下不一致状态(数据文件、锁等)。
killall / pkill:按名字杀
killall nginx # 杀所有 nginx 进程
killall -9 stuck-app # 强杀
pkill -f "python myapp.py" # 按命令行完整匹配
pgrep nginx # 只列 PID 不杀
pgrep -af nginx # 详细
进程的常见状态
R running 正在运行 / 可运行
S sleeping 睡眠(等事件)
D disk wait 不可中断的睡眠(等磁盘 IO,杀不掉)
Z zombie 僵尸(已死但父进程没回收)
T stopped 已停止
僵尸进程:子进程死了但父进程没调 wait() 回收。少量正常;大量僵尸 → 父进程有 bug。
ps aux | grep ' Z ' # 找僵尸
实战
1. 找内存最多的 5 个进程
ps aux --sort=-%mem | head -6
2. 看某个用户的所有进程
ps -u wadely
3. 看进程的完整启动命令
ps -ef | grep nginx
# 或
cat /proc/<pid>/cmdline
4. 看进程打开了哪些文件
sudo lsof -p 1234
下一篇:让进程在后台跑(脱离终端)。