🖥️ 第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。