← 完全使用手册

与 Shell 对话 · 面向系统的操作
进程、权限与系统信息

棱镜2026.6.3  ·  日志

这是《与 Shell 对话》系列的第四篇。前三篇你学会了操作文件、搜索内容、用管道把命令串起来。这一篇从「操作文件」转向「操作计算机本身」——管理正在运行的程序、理解权限系统、查看系统状态,以及 macOS 特有的终端工具。学完这篇,你就能通过终端对整台电脑有全面的掌控感。

上一篇:流水线与重定向  ·  下一篇:让你的 Shell 认识你

🔑 关键词索引

关键词一句话说明
进程(Process)正在运行的程序——每个打开的应用都是一个或多个进程
PID进程的唯一 ID 编号——杀进程时你需要这个数字
前台 / 后台前台占用终端(你不能输入新命令),后台不占用(可以在它运行的同时做别的事)
权限(Permission)文件或程序上的三组标记(所有者/组/其他人 × 读/写/执行)
sudo以超级用户身份执行命令——终端的"授权确认"按钮
chmod修改文件权限——让脚本可以执行、让文件只读
nohup让命令在关闭终端后继续运行——"不挂断"
sw_vers查看 macOS 版本号——Mac 专属
pbcopy / pbpaste终端的剪贴板——把命令输出拷贝出来,或者把文字从剪贴板送进终端
say让 Mac 开口说话——文字转语音

一、进程管理——看清你的电脑在忙什么

每一秒你的 Mac 都在同时运行几十上百个程序——浏览器标签、后台服务、系统守护进程。在终端里,你可以清晰地看到这一切。

1.1 看看都有什么在跑——ps

ps aux                    # 列出系统上所有正在运行的进程
ps aux | head -20         # 前十行看看都有哪些列

ps aux 的输出列解读:

含义
USER哪个用户启动的这个进程
PID进程的唯一编号——杀进程时要这个数
%CPU当前 CPU 占用百分比
%MEM当前内存占用百分比
VSZ / RSS虚拟内存 / 实际物理内存大小
TT终端编号(?表示后台服务进程)
STAT进程状态(S = 休眠,R = 运行,T = 暂停)
STARTED启动时间
TIME累计占用 CPU 的时间
COMMAND命令名和参数

实用例子——用 grep 过滤出感兴趣的进程:

ps aux | grep "chrome"           # Chrome 的所有进程(三四条算正常)
ps aux | grep -v "grep"          # 排除 grep 命令自身(常见的管道技巧)
ps aux | grep "Terminal"         # 终端自己

# 查看某个具体进程的信息
ps aux | grep "PID号"

1.2 实时看——top

top                          # 实时刷新,CPU 使用率最高的排最前

top 持续运行,每秒刷新一次。占用 CPU 最多的进程排在最前面。按 q 退出。你也可以指定只看特定数量的进程:

top -l 5                     # 只刷新 5 次后自动退出
top -o mem                   # 按内存用量排序(macOS 特有)
top -n 10                    # 只显示前 10 个进程(macOS 特有)

ps 是"快照"——给你某一瞬间的完整画面。适合搜索特定进程。top 是"监控器"——持续刷新,让你看到什么在吃 CPU。两个命令各有用途,都学。

1.3 终止进程——killpkill

kill 通过 PID 杀死进程,pkill 通过名字杀死进程:

kill 1234                    # 给 PID 为 1234 的进程发终止信号
kill -9 1234                 # 强制杀死(-9 = SIGKILL,不到万不得已不用)
pkill -i chrome              # 按名字杀死进程(-i 忽略大小写)
pkill -f "进程全名"           # 按完整命令行匹配杀死

信号的礼貌程度:

信号写法行为什么时候用
SIGTERMkill PID请求进程自行退出优先使用——给进程清理的机会
SIGKILLkill -9 PID强制杀死,无法被捕获进程彻底卡死时最后的办法

⚠️ kill -9 不会给进程保存数据的机会。尽量先用不带 -9 的普通 kill,等几秒没反应再用强制信号。

1.4 前后台——&Ctrl+Zjobsfgbg

这是终端多任务的基础——让程序在后台运行,终端不被占用。

# 在命令末尾加 &,让它在后台启动
sleep 30 &                   # sleep 30 会在后台等待 30 秒
[1] 12345                    # Shell 告诉你:后台作业 1,PID 12345

# 查看后台作业
jobs
[1]  + running    sleep 30

# 把后台作业调到前台
fg %1                        # 把作业 1 调回前台

# 前台运行时,按 Ctrl+Z 可以暂停它
# (假设 sleep 30 正在前台,按 Ctrl+Z)
^Z
[1]  + suspended  sleep 30

# 让暂停的作业在后台继续运行
bg %1

# 现在你可以继续输入新命令了

实际场景:你正在用 find 搜索大目录,突然想不起来另一个事情——按 Ctrl+Z 暂停搜索,查完之后 fg 继续搜。

记住这套流程:命令 & 直接后台 → jobs 查看后台 → fg %编号 调回前台 → Ctrl+Z 暂停 → bg %编号 在后台继续跑。这是一套完整的前后台生命周期。

二、持久化运行——关了终端程序也不会停

后台运行(&)有一个局限:如果你关闭终端窗口,后台进程也会跟着退出。这是因为它依附于 Shell 会话。如果你想让程序在关闭终端后继续运行:

2.1 nohup——不挂断运行

nohup 命令 &                 # 让命令在关闭终端后继续运行

nohup = No Hang Up(不挂断)。它让进程忽略 SIGHUP 信号——当终端关闭时,Shell 会向它启动的所有进程发送 SIGHUP,告诉它们"该结束了"。nohup 让进程无视这个信号。

# 实际场景:跑一个很长的 find,关掉终端去吃饭
nohup find ~ -name "*.md" > 找到的文件.txt &

# 关掉终端,吃完饭回来,发现输出已经写入了 找到的文件.txt

使用 nohup 后,默认会生成一个 nohup.out 文件存放输出。用重定向可以改变这个行为(如上例中的 > 找到的文件.txt)。

2.2 caffeinate——不让电脑睡着

这是 macOS 特有的命令。有些任务需要电脑保持唤醒——比如正在下载大文件、正在渲染视频:

caffeinate find ~ -name "*.md"    # 运行命令期间阻止系统自动睡眠
caffeinate -s                      # 屏幕关闭时依然保持系统清醒
caffeinate -t 3600                 # 阻止自动睡眠一小时(3600 秒)
caffeinate &                       # 在后台运行,避免当前终端被占用
#   用 jobs 查看它,用 fg 调回前台然后 Ctrl+C 停止,
#   或者直接用 kill %1 终止

默认的 caffeinate 只阻止自动休眠——你用 pmset sleepnow 强制睡眠时仍然有效(还记得第一篇就讨论过的吗)。

nohupcaffeinate 打交道时要记住:它们让你的命令独立于终端会话生存。这意味着你不能随便用 Ctrl+C 停掉它们了(除非你 kill)。用之前确认你确实需要这个命令持续运行——而不是忘了关。

三、权限模型——谁能做什么

在第一篇的 ls -l 输出中,你已经见过每行开头的 drwxr-xr-x 这种字符串。现在是时候彻底读懂它了。

3.1 权限三要素

每个文件或文件夹上都有三组权限,分别针对三种角色:

   d     rwx     r-x     r-x
   ↑     ↑↑↑     ↑↑↑     ↑↑↑
文件类型  所有者   所属组   其他人
          权限    权限    权限
角色位置说明
所有者(User)第 2–4 位文件属于谁,谁就有这组权限
所属组(Group)第 5–7 位与文件同属一个组的成员共享这组权限
其他人(Others)第 8–10 位既不是所有者也不属于该组的人

每组三个字母:

字母含义对文件对文件夹
r读(read)能看文件内容能列出文件夹里的文件
w写(write)能修改文件能在文件夹里增删文件
x执行(execute)能运行这个程序/脚本能 cd 进去、访问里面的文件

差值是 - 表示没有该权限。所以 r-x 就是"可读、可执行、不可写"。

3.2 修改权限——chmod

chmod = Change Mode。最常用的两个场景:

# 场景一:让脚本可以执行(添加 x 权限)
chmod +x 脚本.sh               # 所有人(所有者/组/其他人)加执行权限
chmod u+x 脚本.sh              # 只给文件所有者加执行权限

# 场景二:让文件只读(去掉 w 权限)
chmod -w 重要文件.md            # 所有人失去写权限
chmod u-w 重要文件.md           # 只去掉所有者的写权限

# 场景三:用数字模式批量设置(不需要死记,用的时候查)
chmod 755 脚本.sh              # 所有者rwx, 组r-x, 其他人r-x
chmod 644 文件.md              # 所有者rw-, 组r--, 其他人r--

数字模式的对应规则(好奇再看,不需要背):r=4w=2x=1。把每组三个数字相加:rwx = 4+2+1 = 7,r-x = 4+0+1 = 5,r-- = 4+0+0 = 4。

3.3 sudo——超级用户之门

有些操作普通用户不能做——比如安装系统级软件、修改系统文件、查看其他人的隐私文件夹。sudo(Super User DO)让你以管理员身份执行单条命令。

sudo 命令                      # 以超级用户身份执行
sudo !!                        # 以 sudo 重新执行上一条命令("后悔了,刚才该加 sudo")

# 实际场景
sudo pmset sleepnow            # 强制睡眠(普通用户也能做,sudo 只是例子)
sudo kill -9 进程PID           # 杀死其他用户的进程
sudo ls /private/var/log       # 查看系统日志目录

sudo 会要求你输入当前用户的密码。输入时屏幕上不会有任何显示(连星号都没有)——这是正常现象,不是键盘坏了。输完按回车即可。

⚠️ sudo 的基本原则:只在需要的时候用,用完了立刻回到普通用户状态。 不需要 sudo 的命令不要加 sudo——不是加了显得更厉害,是给系统多一层保护。sudo rm -rf / 是经典的毁灭性命令——虽然现代 macOS 有保护机制阻止它,但仍然说明了一个道理:sudo 让命令获得完整权限的同时,也失去了安全的护栏。

3.4 查看用户信息——whoamiid

whoami                        # 我是谁
aodesai

id                            # 我的用户 ID 和所属组
uid=501(aodesai) gid=20(staff) groups=20(staff),12(everyone),...

这两个命令在你需要确认当前身份时非常有用——特别是当你用了 sudo 后想知道自己是否还在超级用户状态。

四、系统信息——你的电脑一问一答

这一组命令回答关于电脑本身的问题:什么系统、跑了多久、什么配置。

4.1 系统版本——sw_versuname

sw_vers                       # macOS 版本信息(Mac 专属)
ProductName:    macOS
ProductVersion: 15.5
BuildVersion:   24F2024

uname -a                      # 完整系统信息(跨平台通用)
Darwin MacBook-Pro 24.2.0 ... arm64

sw_vers 是 macOS 特有的简洁版本查看器。uname -a 是跨平台的,在 Linux 上也能用,显示内核版本和架构。

4.2 运行时间——uptime

uptime                        # 电脑跑了多久没关机了
10:30  up 3 days, 2:15, 2 users, load averages: 1.8 2.1 2.3

从左到右:当前时间、系统已运行了 3 天 2 小时 15 分、当前登录用户数、最近 1/5/15 分钟的平均负载(数字越低越空闲)。

4.3 日期时间——datecal

date                          # 当前日期时间
2026年 6月 3日 星期三 10:30:00 CST

date "+%Y-%m-%d"              # 自定义格式:年-月-日
2026-06-03

cal                           # 本月日历
cal 2026                      # 全年日历
cal 6 2026                    # 指定年月的日历

date 的名称格式控制(+%Y-%m-%d)值得记住——在脚本中经常用 date "+%Y%m%d_%H%M%S" 给备份文件加上时间戳。

4.4 硬件信息——sysctlsystem_profiler

sysctl -n hw.memsize          # 内存大小(字节)
sysctl -n hw.ncpu              # CPU 核心数
sysctl -n machdep.cpu.brand_string  # CPU 型号

# system_profiler 输出非常详细,可以 grep 过滤
system_profiler SPHardwareDataType | grep "Chip\|Memory\|Serial"

system_profiler 是 macOS 的图形化"系统信息"的终端版——信息量极大,建议总是配合 grep 使用。

这些命令在你需要描述电脑配置时非常实用——比如发帖求助、买配件前确认型号、或者单纯好奇你的 M1 芯片跑了多久没关机了。

五、macOS 工具箱——只有 Mac 上才有的命令

以下命令在 Linux 上不存在——它们是 macOS(及其前身 BSD)独有的。正因为独特,所以特别值得了解。

5.1 终端剪贴板——pbcopypbpaste

这是实用价值最高的 macOS 特有命令。它把你的终端和系统剪贴板连接起来。

# 把命令输出拷贝到剪贴板
cat ~/.zshrc | pbcopy           # 配置内容已复制到剪贴板,可以 Command+V 粘贴到任何地方

# 更短的写法(重定向也支持)
pbcopy < ~/.zshrc               # 同上

# 从剪贴板读取内容
pbpaste                         # 把剪贴板里的内容打印到终端
pbpaste | grep "alias"          # 粘贴板里搜别名
pbpaste > 临时.txt              # 剪贴板内容存入文件

实际场景:你在终端里 grep -r "bug" src/ | pbcopy,然后直接粘贴到聊天软件里发给同事——不需要鼠标选中、右键复制那一套。

5.2 让 Mac 说话——say

say "你好"                      # Mac 会开口说"你好"
say -v Tingting "你好"          # 指定中文语音(Tingting = 中文女声)

# 实际场景一:当长命令跑完时通知你
sleep 10 && say "命令跑完了"     # 10 秒后告诉你

# 实际场景二:整点报时(配合 cron 或循环)
say "现在是下午三点了"

# 列出所有可用的语音
say -v "?" | less   # | less 防止输出太长刷屏

配合管道使用——让 Mac 把命令的输出来"读"给你:

echo "明天多云转晴" | say        # 播报天气
date "+%Y年%m月%d日" | say       # 播报日期

5.3 默认程序与隐藏设置——opendefaults

open 在第一篇已经学过。这里补充两个常用变体:

open -a "Safari"                # 打开 Safari
open -a "System Settings"       # 打开系统设置
open https://www.baidu.com      # 在默认浏览器中打开网址

defaults 是 macOS 隐藏设置的开关——许多系统偏好设置里没有的选项可以通过它修改:

# 查看某个应用的隐藏设置(以 Finder 为例)
defaults read com.apple.finder

# 显示隐藏文件(需要重启 Finder)
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder                  # 退出 Finder(macOS 会自动重启它,从而读取新设置)
# killall 和 kill 的区别:kill 按 PID 杀,killall 按进程名杀

# 恢复——不显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder

⚠️ defaults 可以修改系统层面的行为,用之前最好先搜索确认你要改的 key 是什么意思,避免改出奇怪的问题。

pbcopy/pbpaste 是每天都会用到的实用工具。saydefaults 是偶尔用但很有味道的冷门功能。open 是终端和图形界面的最后一座桥梁。这四个命令构成了 macOS 独有的终端体验——在其他操作系统上你找不到它们。

六、综合练习——掌控你的系统

这次的练习围绕"了解你的电脑正在做什么"展开。

任务一:看看谁在吃 CPU

找出当前占用 CPU 最多的 5 个进程。

👆 查看参考命令
ps aux | sort -nrk 3 | head -5
# 这里 sort 的选项拆开看:
#   -n  按数字排序(不是字典序)
#   -r  倒序(最大的排最前)
#   -k 3  只看第 3 列(%CPU)——这叫"指定排序列"
# 组合起来:按 %CPU 数字从大到小排列,取前 5

任务二:排除"自己"的干扰

当你用 ps aux | grep chrome 时,grep 自己的进程也会出现在结果中。用学过的技巧去掉这一行。

👆 查看参考命令
ps aux | grep chrome | grep -v grep

任务三:看看电脑多久没关机了

用一条命令同时显示运行时间和系统版本。

👆 查看参考命令
uptime
sw_vers

任务四:把系统信息复制到剪贴板

把你的 Mac 型号和内存信息复制到剪贴板,这样在任何地方都能 Command+V 粘贴。

👆 查看参考命令
system_profiler SPHardwareDataType | grep "Chip\|Memory" | pbcopy
# 现在打开任意文本编辑器,Command+V 试试

任务五:让命令跑完后通知你

跑一个耗时的搜索(如 find ~ -name "*.pdf"),跑完后自动播报完成。

👆 查看参考命令
find ~ -name "*.pdf" > pdf清单.txt && say "搜索完成"
# && 的意思是:前一条命令成功后,再执行后面的。
# 如果 find 因为某种原因失败了,say 就不会执行。
# 这是 Shell 中的"短路求值"——只有在左边的命令
# 成功(退出码为 0)时,右边的命令才会运行。

到这一篇为止,你已经不再只是一个"文件操作者"了。你能看进程、杀进程、管理后台任务、理解权限、查看系统信息、用 Mac 特有的工具链。终端不再是你的"旁观窗口"——它是你操纵整台电脑的驾驶舱。

📌 本篇核心命令速查

命令作用最常用法
ps查看进程快照ps aux | grep 关键词
top实时查看进程top → q 退出
kill按 PID 终止进程kill PID kill -9 PID(强制)
pkill按名字终止进程pkill -i 进程名
&后台运行命令 &
Ctrl+Z暂停前台进程暂停后可用 bg 放后台
jobs列出后台作业jobs fg %编号
nohup关闭终端后仍运行nohup 命令 &
chmod修改文件权限chmod +x 文件 chmod 755 文件
sudo超级用户执行sudo 命令 sudo !!
whoami显示当前用户无参数
sw_versmacOS 版本无参数
uptime运行时长无参数
date日期时间date "+%Y-%m-%d"
pbcopy输出→剪贴板命令 | pbcopy
pbpaste剪贴板→终端pbpaste pbpaste | grep 文字
say文字转语音say "文字" echo "文字" | say

待延伸线索


← 上一篇:流水线与重定向 下一篇:让你的 Shell 认识你 →