🖥️ 第06章 · 进程与作业管理
ps top free kill jobs nohup &
进程与作业管理¶
这一章讲"运行的家伙":怎么看谁在跑、占了多少 CPU 和内存、怎么把它停掉、怎么让它跑在后台不被会话中断。排查"服务挂了""端口被占""内存爆了"全靠这些。
列出进程 ps¶
ps 是"看此刻有哪些进程"的命令。最有用的组合是 ps aux 和 ps -ef,两者信息大体等价。
ps aux | head -20 # 最常用,含 CPU/内存占比
ps -ef | head -20 # 另一格式,含父进程 PPID
ps -ef | grep node # 筛出 node 相关进程
ps aux 输出里关键列:
| 列 | 含义 |
|---|---|
USER |
运行进程的用户 |
PID |
进程号,唯一标识 |
%CPU |
占用 CPU 的百分比 |
%MEM |
占用内存的百分比 |
STAT |
状态(R 运行 / S 睡眠 / Z 僵尸) |
COMMAND |
启动命令 |
在这台服务器上查看托管 node 应用的进程:
ps aux | grep -E "node|nginx" | grep -v grep
提示
grep -v grep是为了把"grep 自身那行"也滤掉,否则会看到一条grep 关键词的假进程。
实时监控 top / htop¶
top 是动态刷新视图,htop 更漂亮(普通用户也可装)。
top # 动态刷新,按 q 退出
top -bn1 # 只打印一次就退出(脚本里常用)
top 顶部是负载、任务数、CPU/内存总览;下方是每个进程。交互按键:
| 按键 | 作用 |
|---|---|
q |
退出 |
M |
按内存排序 |
P |
按 CPU 排序 |
k |
杀死某进程(输入 PID) |
3/1 |
按 CPU 核/全核切换显示 |
提示 排查卡顿:先
top看是 CPU 高了还是内存吃满了;再top -bn1 | grep -i mem(或按M)找"大户"进程。
查看内存 free¶
free -h
| 行 | 含义 |
|---|---|
Mem |
物理内存总量/已用/剩余/缓存 |
Swap |
换分区用没用到(为 0 且内存高,警惕 OOM) |
注意 Linux 的"内存已用"看起来总是很高,那是因为它把空闲内存当缓存用了,不是真不够。真正要盯的是
available(可用)这一列和Swap是否在使用。Swap 都被占了,通常意味着内存吃紧。
查看端口与有关进程 ss / lsof¶
排查"端口被谁占用"——这是运维最日常的排查。
ss -lntp | grep 3000 # 看 3000 端口被哪个进程监听
ss -lntup # 列出所有监听的 TCP/UDP 端口及进程
ss 与过时的 netstat 相比更快、更现代,优先用 ss。输出里 :3000 代表端口,pid=.. 代表监听进程。
提示 端口被占用会报
Address already in use。用ss -lntp | grep 端口找到 PID,再kill它,或改配置换端口——这是处理"端口冲突"的标准流程。
杀进程 kill¶
| 信号 | 数字 | 作用 |
|---|---|---|
SIGTERM |
15 |
温和请求退出(默认) |
SIGKILL |
9 |
强制杀死,不给清理机会(仅逼不得已) |
SIGHUP |
1 |
挂断/让进程重加载配置 |
kill PID # 默认 SIGTERM,温和停止
kill -9 PID # 强杀,不推荐,可能留下副作用
killall nginx # 按命令名杀所有 nginx
pkill -f "node server.js" # 按进程命令行关键字匹配杀掉
警告 优先
kill(默认 15),给进程一次优雅退出的机会。kill -9会立刻终结进程,MySQL 这类数据库可能因此留下未落盘的数据。能用kill 15就别用kill -9。给 nginx 或应用发SIGHUP可以重载配置而不打断服务。
后台运行 jobs & nohup¶
在终端里启动一个长任务(如 server.js、长 sleep),它会"霸占"当前终端。处理方式:
| 方式 | 命令 | 用途 |
|---|---|---|
| 后台运行 | 命令 & |
把任务放到后台,终端可继续用 |
| 查看后台任务 | jobs |
列出当前会话的后台作业 |
| 调回前台 | fg %1 |
把一个后台作业调到前台 |
| 挂后台暂停 | Ctrl+Z |
暂停当前前台任务到后台 |
| 不随会话退出 | nohup 命令 & |
断开 SSH 后任务仍继续 |
node server.js & # 后台启动
jobs # 看编号
fg %1 # 调回前台
注意 普通
命令 &在关闭终端/断开 SSH 后会被杀死。要让任务在会话结束后仍存活,要nohup 命令 &(或配 systemd /setsid)。nohup输出的内容默认进nohup.out。
真实场景:这台服务器用什么托管¶
这台服务器上的 Node 前端应用并不是靠 nohup 裸跑的,而是由 systemd 托管:
WorkingDirectory /var/www/bangdream
ExecStart /usr/local/bin/node server.js
NODE_ENV=production
监听 127.0.0.1:3000
systemd 的好处:开机自启、崩溃自动拉起、日志统一管理。与之对应的常用 systemctl 命令:
systemctl status bangdream # 看服务状态(是 systemd 服务名)
systemctl restart bangdream # 重启
systemctl stop bangdream # 停止
journalctl -u bangdream -f # 实时看该服务日志
提示
nohup &适合临时任务和测试;生产环境长期服务,应尽量用 systemd(或 pm2)。判断一个进程是不是被 systemd 管理:systemctl list-units | grep 名字看有没有对应服务。
易错点¶
kill -9是最后手段,先kill 15。命令 &会随 SSH 断开而死,要长驻用nohup或 systemd。free显示已用高不等于内存不足,看available与Swap。- 僵尸进程(STAT 为 Z) 是子进程已死但父进程没回收,一般要处理父进程。
相关命令¶
ps、top、htop、free、ss、kill、killall、pkill、jobs、fg、bg、nohup、uptime、systemctl。