OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 040

进程与作业管理

用进程快照、信号和前后台作业理解程序的运行与退出。

所在专题Linux 命令行基础与组合 ↗
约 6 分钟阅读开始阅读

查看进程#

ps — 进程快照

ps              # 当前终端启动的进程,极少用
ps aux          # 全系统所有进程,最常用
ps aux | grep nginx   # 筛选含 nginx 的进程

ps aux 每一列的含义:

列 含义 怎么看
USER 进程所属用户 root 还是你的用户名
PID 进程唯一 ID 后面 kill 要用
%CPU CPU 占用率 哪个在吃 CPU
%MEM 内存占用率 哪个在吃内存
VSZ/RSS 虚拟/物理内存 通常只看 RSS
STAT 进程状态 S=睡眠 R=运行 Z=僵尸
COMMAND 启动命令 这就是你在跑的东西

top — 实时进程监控

top              # 进入交互界面,按 q 退出

进入 top 后的常用按键:

  • P — 按 CPU 占用排序
  • M — 按内存占用排序
  • k — 输入 PID 杀掉进程
  • q — 退出

htop — top 的彩色升级版

htop             # 更直观,支持鼠标点击

终止进程#

kill — 向进程发信号

kill PID            # 礼貌地请进程退出(SIGTERM,信号 15)
kill -9 PID         # 强制杀死(SIGKILL,信号 9)
kill -l             # 列出所有信号类型

流程:先用 ps aux | grep 进程名 找到 PID,再用 kill PID 处理。不响应才用 kill -9。

pkill — 按名字杀进程

pkill nginx          # 杀掉所有名字匹配 nginx 的进程
pkill -9 -f "python script.py"   # 强制杀,匹配完整命令行

不用先查 PID,比 kill 更直接。

killall — 按精确名字杀

killall firefox      # 杀所有 firefox 进程

前后台与作业管理#

这是新手最迷惑的地方,但理解模型很简单:

前台 = 霸占终端,运行期间你不能敲别的命令
后台 = Shell 不等待它结束;仍可能向终端输出,也可能因读取终端而暂停

& — 启动时放到后台

python train.py &       # 直接在后台启动
sleep 100 &             # 后台睡 100 秒

启动后会打印 [作业号] PID,比如 [1] 12345。

jobs — 查看当前终端的后台作业

jobs                # 列出所有后台作业
jobs -l             # 附带 PID

输出示例:

[1]  - running    python train.py
[2]  + running    sleep 100

+ 表示最近操作的作业(fg 不带参数时默认调它)。

fg — 把后台作业调到前台

fg          # 调回最近的那个
fg %1       # 调回作业号 1
fg %sleep   # 调回名字含 sleep 的

bg — 把暂停的作业放到后台继续跑

bg %1       # 把作业 1 放到后台继续

Ctrl+Z — 暂停当前前台任务

在终端里按 Ctrl+Z,当前任务会暂停并回到 Shell。然后你可以:

bg          # 让它在后台继续跑
fg          # 或者调回前台继续

nohup — 忽略挂断信号

nohup python train.py &     # 忽略 SIGHUP,通常可在终端关闭后继续;不保证跨注销策略存活
nohup python train.py > output.log 2>&1 &   # 输出写到文件

配合 systemctl#

systemctl 管理 systemd 的 unit 和系统状态;默认连接系统管理器,systemctl --user 连接用户管理器。用户程序也可作为 user service 管理:

场景 用这个
用户自己跑的程序 ps / kill / jobs / &
系统服务(nginx/ssh/docker) systemctl start/stop/status
想开机自启 systemctl enable 服务名

系统电源管理

systemctl 也负责关机、重启、挂起等系统级操作:

systemctl poweroff    # 关机(等价于直接敲 poweroff)
systemctl reboot      # 重启(等价于直接敲 reboot)
systemctl suspend     # 挂起/睡眠
systemctl hibernate   # 休眠(写盘后断电)

poweroff 和 reboot 之所以可以直接敲(不需要 systemctl 前缀),是因为它们是系统历史上就存在的独立命令。systemd 保留了它们作为兼容入口——在 systemd 系统中通常由兼容入口处理;具体文件或链接布局取决于发行版。

这里使用 systemctl suspend 和 systemctl hibernate;独立入口及兼容命令因发行版和所安装工具而异。休眠还需要内核、交换空间与恢复配置支持。

系统服务详解见 Linux 登录与会话。


日常场景速查#

我想... 命令
看谁在吃 CPU top 或 htop
看某个程序在不在跑 ps aux | grep 关键词
杀死卡死的程序 pkill 程序名,不行就 pkill -9
后台跑脚本 ./script.sh &
关了终端继续跑 nohup ./script.sh &
看看后台有什么 jobs
把后台的调到前台 fg
暂停当前程序 Ctrl+Z


参考与延伸

  1. GNU Coreutils 手册 ↗
  2. GNU Findutils 手册 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Linux 命令行基础与组合

  1. 01文件与目录操作
  2. 02进程与作业管理
  3. 03文本处理与系统查询
  4. 04Shell 基本功
  5. 05模糊搜索:fzf
  6. 06参数传递:xargs
CONTINUE READING / 下一篇文本处理与系统查询

从分页浏览和文本筛选走向内存、磁盘、网络与端口查询。