TW●汤伟的数字生活NOTES ON A DIGITAL LIFE
个人数字生活文库始于 2026 · 持续修订总目录 ↗

FIELD MANUAL / 命令速查

忘了命令,来这里查。

按任务找命令,先核对平台与风险。复制只复制文本,不会连接设备,也不会执行命令。

示例中的路径、服务名和 PID 必须替换并复核。查询命令也可能输出敏感信息或发出网络请求;不要把结果未经脱敏贴到公开网站。Linux、macOS 与 DSM 的命令选项不完全相同。

80 条命令

前端与 Git#

看清工作区与暂存区

看清工作区与暂存区命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
查询 / 诊断
git status --short --branch

在仓库内查看分支和路径状态。

怎样判断结果
“ M”为未暂存,“M ”为已暂存,“MM”为两处都有改动,“??”为未跟踪。
容易踩的坑
空状态不展示被忽略文件;合并冲突时状态码需按冲突语义解释。
官方参考:Git status ↗
前端与 Git#

查看尚未暂存的补丁

查看尚未暂存的补丁命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
查询 / 诊断
git diff -- src/demo.ts

从仓库根目录比较示例文件的工作区与暂存区。

怎样判断结果
显示尚未暂存的增删;无差异时不输出补丁。
容易踩的坑
不包含已暂存部分,也不展示未跟踪文件正文。
官方参考:Git diff ↗
前端与 Git#

检查下一次提交的内容

检查下一次提交的内容命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
查询 / 诊断
git diff --cached -- src/demo.ts

比较暂存区与 HEAD。

怎样判断结果
输出将被纳入提交的该文件差异。
容易踩的坑
若暂存后继续编辑,这里不会显示后续未暂存编辑。
官方参考:Git diff ↗
前端与 Git#

检查已暂存补丁空白问题

检查已暂存补丁空白问题命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
查询 / 诊断
git diff --cached --check

检查暂存差异中的空白错误和冲突标记。

怎样判断结果
通过通常无输出;发现问题时报告路径与行号并非零退出。
容易踩的坑
不能验证业务逻辑、类型或所有冲突处理正确性。
官方参考:Git diff ↗
前端与 Git#

按块暂存已跟踪文件

按块暂存已跟踪文件命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
会修改状态
git add -p -- src/demo.ts

交互选择属于本次修复的块。

怎样判断结果
y 接受、n 跳过、q 退出;结束后查看 cached diff。
容易踩的坑
s 不一定能拆分每个块;未跟踪新文件应先独立检查。
官方参考:Git add ↗
前端与 Git#

取消暂存但保留内容

取消暂存但保留内容命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
会修改状态
git restore --staged -- src/demo.ts

从 HEAD 恢复该路径的暂存状态。

怎样判断结果
暂存补丁消失,编辑仍在工作区。
容易踩的坑
需要已有 HEAD;不要误加 --worktree,那会扩大覆盖范围。
官方参考:Git restore ↗
前端与 Git#

保存临时现场

保存临时现场命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
会修改状态
git stash push -u -m "before-demo-investigation"

保存已跟踪修改及未跟踪文件,并清理被收纳内容。

怎样判断结果
出现保存说明,随后用 stash list 和 status 核对。
容易踩的坑
不包含忽略文件和子模块内部现场;重要文件先另有副本。
官方参考:Git stash ↗
前端与 Git#

检查待恢复的现场

检查待恢复的现场命令示例 · macOS / Linux / Windows(Git 2.32+,仓库已有提交)
查询 / 诊断
git stash show --stat --include-untracked 'stash@{0}'

显示最新 stash 的文件统计,实际恢复前核对条目说明。

怎样判断结果
列出本次保存涉及的路径及行数统计。
容易踩的坑
编号随 stash 新增而变化;统计不是完整正文审查。Git 2.32 前的 show 不支持此 --include-untracked 选项。
官方参考:Git stash 2.32:包含未跟踪文件 ↗
前端与 Git#

恢复现场并保留 stash

恢复现场并保留 stash命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
会修改状态
git stash apply 'stash@{0}'

在确认条目和当前分支后恢复;建议先保证工作区干净。

怎样判断结果
修改回到工作区,stash 条目仍保留。
容易踩的坑
可能冲突,普通 apply 不保证恢复暂存分层;不要反复应用。
官方参考:Git stash ↗
前端与 Git#

反向处理最后一个普通提交

反向处理最后一个普通提交命令示例 · macOS / Linux / Windows(Git 2.23+,仓库已有提交)
会修改状态
git revert HEAD

仅在工作区干净、已用 git show 确认 HEAD 正是目标普通提交时使用。

怎样判断结果
产生抵消改动的新提交,或停在冲突处理阶段。
容易踩的坑
合并提交不能照搬;冲突解决后 continue,放弃序列用 abort,先另存冲突编辑。
官方参考:Git revert ↗
前端与 Git#

核对实际 Node 执行路径

核对实际 Node 执行路径命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
查询 / 诊断
node -p "JSON.stringify({version:process.version,execPath:process.execPath,platform:process.platform,arch:process.arch})"

输出当前进程版本、文件路径、操作系统和架构。

怎样判断结果
例如平台 darwin、linux 或 win32,架构可能是 arm64 或 x64。
容易踩的坑
这里是当前 shell 的 Node;项目脚本若启用独立运行时还需核对其实际环境。
官方参考:Node process ↗
前端与 Git#

查看直接依赖版本

查看直接依赖版本命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
查询 / 诊断
pnpm list vue vite typescript vue-tsc --depth 0

在实际应用包目录查看已安装直接依赖。

怎样判断结果
显示包名和实际安装版本。
容易踩的坑
没列出不等于整个工作区没有;确认目录和依赖层级。
官方参考:pnpm list ↗
前端与 Git#

追踪 Vite 的引入链

追踪 Vite 的引入链命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
查询 / 诊断
pnpm why vite

查找当前包为何依赖 Vite。

怎样判断结果
显示直接或间接引入关系。
容易踩的坑
依赖多版本不自动构成错误,要结合实际加载位置。
官方参考:pnpm why ↗
前端与 Git#

按锁文件安装依赖

按锁文件安装依赖命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
会修改状态
pnpm install --frozen-lockfile

先确认清单、锁文件与 pnpm 主版本匹配;写入依赖目录但不更新锁文件。

怎样判断结果
一致时安装完成;缺少或过期锁文件时失败。
容易踩的坑
会下载、写缓存并可能运行允许脚本;工作区安装可影响多个包。
官方参考:pnpm 10 install ↗
前端与 Git#

检查应用单文件组件类型

检查应用单文件组件类型命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
会修改状态
pnpm exec vue-tsc --noEmit -p tsconfig.app.json

前提是本地已安装 vue-tsc 且此配置包含目标源码。

怎样判断结果
无类型错误时零退出;错误输出带路径和诊断编号。
容易踩的坑
不输出 JS 不等于不写缓存;根配置仅 references 时应走项目既有 build 类型检查流程。
官方参考:Vue TypeScript ↗
前端与 Git#

固定本地开发入口

固定本地开发入口命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
会修改状态
pnpm exec vite --host 127.0.0.1 --port 5173 --strictPort

用已安装 Vite 启动回环服务,端口冲突直接失败。

怎样判断结果
显示本地地址,或明确报端口被占。
容易踩的坑
会写缓存;绕过项目 dev 脚本附加逻辑,先确认可直接调用。Ctrl+C 停止,不用于生产。
官方参考:Vite CLI ↗
前端与 Git#

按 staging 模式生成产物

按 staging 模式生成产物命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
高风险操作
pnpm exec vite build --mode staging

使用 staging 模式配置构建;先核对 outDir 是可再生目录。

怎样判断结果
生成静态产物,成功零退出。
容易踩的坑
可能清空输出目录;不自动执行项目额外类型检查。模式名不是 NODE_ENV。
官方参考:Vite 环境变量与模式 ↗
前端与 Git#

本机验收构建产物

本机验收构建产物命令示例 · macOS / Linux / Windows(已安装项目指定 Node / pnpm)
会修改状态
pnpm exec vite preview --host 127.0.0.1 --port 4173 --strictPort

先完成构建,再用同一配置启动预览。

怎样判断结果
在本地地址看到已生成页面;Ctrl+C 结束。
容易踩的坑
不构建源码,不提供正式生产服务,也不能证明真实托管路由正确。
官方参考:Vite 静态部署 ↗
前端与 Git#

带来源检查本地健康接口

带来源检查本地健康接口命令示例 · macOS / Linux curl;Windows PowerShell 用 curl.exe
查询 / 诊断
curl -i --max-time 10 'http://127.0.0.1:8080/health' -H 'Origin: http://127.0.0.1:5173'

前提是自行控制的本机只读健康服务已启动;输出响应头与正文。

怎样判断结果
观察 HTTP 状态及允许来源头;连接拒绝说明没有连上此服务。
容易踩的坑
curl 不执行浏览器 CORS 检查;成功仍需回浏览器验证。
官方参考:curl 官方手册 ↗
前端与 Git#

模拟本地 GET 预检

模拟本地 GET 预检命令示例 · macOS / Linux curl;Windows PowerShell 用 curl.exe
查询 / 诊断
curl -i --max-time 10 -X OPTIONS 'http://127.0.0.1:8080/health' -H 'Origin: http://127.0.0.1:5173' -H 'Access-Control-Request-Method: GET' -H 'Access-Control-Request-Headers: X-Demo-Trace'

模拟带 X-Demo-Trace 头的跨源 GET 许可检查,只发送 OPTIONS。

怎样判断结果
核对允许来源、GET 方法与 X-Demo-Trace 头;204 本身不证明允许配置完整。
容易踩的坑
不会自动发送实际 GET;实际响应也需正确 CORS 头,API 必须是受控测试服务。
官方参考:Fetch Standard ↗
Docker 与 Compose#

确认当前 Docker 上下文

确认当前 Docker 上下文命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker context show

用途:操作前确认当前 context 名称;无附加参数,不改变上下文。

怎样判断结果
返回 default、desktop-linux 或自定义名称,应与你计划的引擎相符。
容易踩的坑
名称本身不证明机器身份;DOCKER_HOST、DOCKER_CONTEXT 或命令行参数可能影响实际连接,应结合 docker version 核对,不随手切换生产目标。
官方参考:docker context show ↗
Docker 与 Compose#

同时查看客户端与引擎版本

同时查看客户端与引擎版本命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker version

用途:核对 API 和引擎连接;无附加参数,分别显示 Client 与 Server。

怎样判断结果
两部分都能读取;Server 的版本与平台才是部署判断依据。
容易踩的坑
docker --version 只反映客户端。只有 Client 或连接报错时先处理引擎连接,不能据此判断仓库不可达。
官方参考:docker version ↗
Docker 与 Compose#

检查 Compose 插件能力

检查 Compose 插件能力命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker compose version

用途:读取 Compose 插件版本;无附加参数,配合具体子命令 --help 判断选项。

怎样判断结果
显示 Compose 版本;支持本文语法后才继续。
容易踩的坑
本文使用 Compose v2 风格的 docker compose 命令。DSM 的套件版本不等于插件版本;若命令不存在,不要自动换成旧二进制运行新版配置。
官方参考:docker compose version ↗
Docker 与 Compose#

只验证配置不展开秘密

只验证配置不展开秘密命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker compose -p bloglab -f compose.yaml config -q

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:解析并校验配置;-q 只验证不渲染完整配置。

怎样判断结果
退出码零且通常没有输出;非零时按报错定位缩进、缺失变量或非法字段。
容易踩的坑
不验证业务就绪或端口空闲。错误文本也需脱敏;不要改用 config --environment 排错后公开输出。
官方参考:docker compose config ↗
Docker 与 Compose#

确认服务名

确认服务名命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker compose -p bloglab -f compose.yaml config --services

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:列出最终模型中的服务键;--services 仅输出服务名。

怎样判断结果
应包含 web;真实多服务项目会逐行出现其他服务。
容易踩的坑
服务名不是容器名。选错 -f 或项目目录可能得到另一套服务清单;此命令不证明容器已经创建。
官方参考:docker compose config ↗
Docker 与 Compose#

查看包括已退出容器的状态

查看包括已退出容器的状态命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker compose -p bloglab -f compose.yaml ps -a

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:查看运行与停止状态;-a 包含未运行容器。

怎样判断结果
查看 State/Status、服务和端口;退出或重复重启需结合日志排查。
容易踩的坑
running 不代表业务健康,无 healthcheck 时不能推断就绪。空结果可能是项目名不一致,不能立即创建新项目覆盖判断。
官方参考:docker compose ps ↗
Docker 与 Compose#

按时间窗口读取服务日志

按时间窗口读取服务日志命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker compose -p bloglab -f compose.yaml logs --since 15m --tail 200 --timestamps web

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:定位最近错误;--since 限定十五分钟,--tail 限制每容器行数,--timestamps 附时间。

怎样判断结果
按报错发生时间检查权限、连接、初始化和退出信息。
容易踩的坑
日志可能含秘密或业务数据,分享前脱敏;文件日志未必出现在这里。多副本会输出各自日志,不是全项目只取两百行。
官方参考:docker compose logs ↗
Docker 与 Compose#

查容器端口实际发布到哪里

查容器端口实际发布到哪里命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker compose -p bloglab -f compose.yaml port web 80

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:查询 web 的容器端口 80 对应的宿主入口。

怎样判断结果
示例应返回 127.0.0.1:18080;按地址确认是本机回环还是网络接口。
容易踩的坑
NAS 回环不是笔记本 localhost;未发布或容器尚未创建可能无结果。旧 Engine 的回环隔离差异仍需检查。
官方参考:docker compose port ↗
Docker 与 Compose#

仅检查挂载类型与读写标志

仅检查挂载类型与读写标志命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker inspect --format '{{range .Mounts}}{{println .Type .Name .Destination .RW}}{{end}}' CONTAINER_ID

用途:定位持久化挂载;先用 docker ps -a 取得并替换 CONTAINER_ID。--format 仅输出挂载必要字段。

怎样判断结果
volume 的 Name 对应实际卷名,Destination 是容器目录,RW=false 表示该容器只读。
容易踩的坑
绑定挂载 Name 可能为空。本命令不打印 Env;不要用全量 inspect 分享配置,也不要把容器内目录当宿主机路径。
官方参考:docker container inspect ↗
Docker 与 Compose#

读取退出码与 OOM 标记

读取退出码与 OOM 标记命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker inspect --format 'status={{.State.Status}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}}' CONTAINER_ID

用途:区分退出状态与内存终止线索;CONTAINER_ID 替换为已确认容器 ID,--format 只取三项状态。

怎样判断结果
看 status、exit 和 oom;oom=true 表示该状态记录中出现 OOM 终止。
容易踩的坑
非零退出需结合应用日志,137 不能单独证明 OOM。状态是当前可见记录,不是完整历史。
官方参考:docker container inspect ↗
Docker 与 Compose#

记录运行容器镜像身份

记录运行容器镜像身份命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker inspect --format 'ref={{.Config.Image}} image_id={{.Image}}' CONTAINER_ID

用途:升级前后核对运行内容;替换 CONTAINER_ID,ref 是创建时引用,image_id 是所用镜像 ID。

怎样判断结果
记录引用和 sha256 镜像 ID;升级后核对是否符合目标。
容易踩的坑
仓库浮动标签可能已改变,Config.Image 相同不保证镜像内容相同;不要把本地 image ID 当远端清单摘要。
官方参考:docker container inspect ↗
Docker 与 Compose#

查询本地镜像仓库摘要

查询本地镜像仓库摘要命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker image inspect --format '{{json .RepoDigests}}' IMAGE_ID

用途:记录可追溯仓库摘要;IMAGE_ID 替换为已确认的本地镜像 ID,--format 限定 RepoDigests。

怎样判断结果
返回仓库@sha256 引用数组;可用于部署记录。
容易踩的坑
本地构建或导入镜像可能没有 RepoDigests。空值时需要其他可信发布记录,不伪造摘要;跨平台摘要层次须辨清。
官方参考:docker image inspect ↗
Docker 与 Compose#

按名称筛查目标卷

按名称筛查目标卷命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker volume ls --filter name=bloglab_site

用途:确认示例卷存在;--filter name 缩小名称范围,不挂载或修改卷。

怎样判断结果
从输出核对精确名称 bloglab_site 和驱动。
容易踩的坑
可能匹配多个相似名字;列表存在不代表内容正确。拼错名称后运行挂载命令可能意外创建空卷,应先精确核对。
官方参考:docker volume ls ↗
Docker 与 Compose#

找出引用同一卷的容器

找出引用同一卷的容器命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker ps -a --filter volume=bloglab_site --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}'

用途:备份前检查卷使用者;-a 包含停止容器,volume 过滤引用,--format 限制输出列。

怎样判断结果
列出各容器及状态;核对是否存在其他写入者。
容易踩的坑
引用不代表正在写入;空结果也不能证明外部进程绝不访问该存储。数据库一致性仍由应用备份流程保证。
官方参考:docker container ls ↗
Docker 与 Compose#

查看 Docker 分类磁盘用量

查看 Docker 分类磁盘用量命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker system df

用途:镜像下载前或磁盘报警时分类查询;无附加参数。

怎样判断结果
查看 Images、Containers、Local Volumes 和 Build Cache 的用量及可回收估计。
容易踩的坑
可回收不是可以无损删除;也不是宿主机剩余空间。禁止据此直接 prune --volumes 或 down -v。
官方参考:docker system df ↗
Docker 与 Compose#

读取一次容器资源快照

读取一次容器资源快照命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker stats --no-stream CONTAINER_ID

用途:观察 CPU、内存及 I/O 指标;替换 CONTAINER_ID,--no-stream 输出一次后退出。

怎样判断结果
看内存使用与限制、CPU 和 I/O,必要时与同时间业务表现比较。
容易踩的坑
快照不能证明长期瓶颈或 OOM 原因;Mac 数值属于虚拟化引擎环境,不能等同整机全部内存。
官方参考:docker container stats ↗
Docker 与 Compose#

只下载服务目标镜像

只下载服务目标镜像命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
会修改状态
docker compose -p bloglab -f compose.yaml pull web

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:提前准备镜像;web 限定服务,联网下载并改变本地镜像缓存。

怎样判断结果
显示下载进度或已存在,成功退出表示该次拉取完成。
容易踩的坑
不会升级正在运行的容器。配置若要求 WEB_IMAGE,先设置已核实引用;失败时不要加忽略失败参数继续发布。
官方参考:docker compose pull ↗
Docker 与 Compose#

独立拉取指定版本镜像

独立拉取指定版本镜像命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
会修改状态
docker pull docker.io/library/nginx:1.28.0-alpine

用途:最小复现下载问题或准备示例镜像;显式仓库路径和标签避免省略标签默认选择。

怎样判断结果
正常时出现层状态及摘要,失败时按 DNS、TLS、认证、限流或平台信息分类。
容易踩的坑
联网并占磁盘;该历史标签只演示语法,不代表最新安全版本。成功下载不代表服务已更新或可运行。
官方参考:docker image pull ↗
Docker 与 Compose#

查询远端支持的平台

查询远端支持的平台命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
查询 / 诊断
docker buildx imagetools inspect docker.io/library/nginx:1.28.0-alpine

用途:核对清单中可运行的平台;需要可用 Buildx,此命令联网查询元数据。

怎样判断结果
查看清单及 Platform 字段,确认所需 linux/arm64 或 linux/amd64。
容易踩的坑
只查询远端元数据,仍会产生网络访问。附属证明条目可能是 unknown/unknown;插件缺失不是镜像缺失。
官方参考:docker buildx imagetools inspect ↗
Docker 与 Compose#

通过官方流程登录 Docker Hub

通过官方流程登录 Docker Hub命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
会修改状态
docker login

用途:为可信 Docker Hub 配置认证;无主机参数时使用默认 Hub 流程,按提示完成设备码等验证。

怎样判断结果
官方认证流程完成并提示登录成功,之后单独重试目标镜像。
容易踩的坑
联网并改变本地凭据存储;不读取或分享 config.json、口令或 token。登录不保证私有仓库权限,也不保证解决所有 429。
官方参考:docker login ↗
Docker 与 Compose#

应用已经准备好的单服务配置

应用已经准备好的单服务配置命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
高风险操作
docker compose -p bloglab -f compose.yaml up -d --no-deps --no-build --pull never web

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:重建发生镜像或配置变化的 web;-d 后台,--no-deps 不连带依赖,--no-build 不构建,--pull never 不拉取。

怎样判断结果
成功后需检查 ps、镜像 ID、日志及关键业务路径;挂载命名卷被复用。
容易踩的坑
可能替换运行容器并中断服务,标 danger。先有备份及本地目标镜像,且依赖无需同步改变;旧插件先查帮助,参数不支持就停止。
官方参考:docker compose up ↗
Docker 与 Compose#

在维护窗口停止静态服务

在维护窗口停止静态服务命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
高风险操作
docker compose -p bloglab -f compose.yaml stop -t 30 web

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:停止现有 web;-t 30 给出退出等待秒数,不删除容器或卷。

怎样判断结果
后续 ps -a 应显示服务已停止,日志应符合正常关闭预期。
容易踩的坑
会中断业务,超时可能强制终止。停止 web 不保证数据库或其他容器停写,不能据此直接打包活动数据库卷。
官方参考:docker compose stop ↗
Docker 与 Compose#

恢复已停止的现有服务

恢复已停止的现有服务命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
会修改状态
docker compose -p bloglab -f compose.yaml start web

在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:启动已经创建而停止的 web;不带重建参数。

怎样判断结果
服务进入运行状态,随后检查日志及访问路径。
容易踩的坑
会改变运行状态并触发应用启动行为。不会应用新镜像或替代迁移;不存在容器时不能用 start 完成首次部署。
官方参考:docker compose start ↗
Docker 与 Compose#

把已停写静态卷归档到本地目录

把已停写静态卷归档到本地目录命令示例 · macOS Docker Desktop、Linux Docker Engine、DSM:先确认 CLI/插件版本与 --help;操作当前已核实引擎
会修改状态
docker run --rm --pull=never --network none \
  --mount type=volume,src=bloglab_site,dst=/source,readonly \
  --mount "type=bind,src=$PWD/backups,dst=/backup" \
  alpine:3.22 sh -c 'test ! -e /backup/site-20260908.tar.gz && tar -czf /backup/site-20260908.tar.gz -C /source .'

用途:备份静态站点文件。前提:精确核对源卷存在、全部写入者已停、项目根目录有 backups、已下载 alpine:3.22,终端路径与引擎宿主路径对应。--rm 删除临时容器,readonly 保护源卷,--pull=never 禁止临时拉取,--network none 禁用容器联网。

怎样判断结果
退出码零后检查归档存在和 tar 清单,再恢复到新卷验证内容;无输出本身不证明备份可靠。
容易踩的坑
会创建容器并写归档,标 write。同名归档存在就失败,重复演练需换文件名;不用于直接打包运行中数据库。远程 context 下本地 $PWD 不是远程目录。
官方参考:Volumes:生命周期、挂载与备份恢复 ↗
Linux 运维#

按文件名缩小查找范围

按文件名缩小查找范围命令示例 · Linux(GNU find)
查询 / 诊断
find ./personal-lab -xdev -type f -name '*.log' -print

-xdev 不跨文件系统,-type f 只选普通文件,单引号保护通配符;只在自己的实验目录查询。

怎样判断结果
示意:./personal-lab/logs/app.log;空输出仅表示范围内没有匹配。
容易踩的坑
权限拒绝时结果不完整,先核对路径和目录访问权;文件名可含换行,输出不能直接交给 xargs 或当作可靠记录边界。
官方参考:GNU Findutils 官方手册 ↗
Linux 运维#

核对权限与属主

核对权限与属主命令示例 · Linux(GNU stat)
查询 / 诊断
stat -c '%A %a %U:%G %n' -- ./personal-lab/config.txt

-c 指定格式,依次显示符号权限、八进制权限、属主属组和名称;-- 结束选项。

怎样判断结果
示意:-rw------- 600 lab:lab ./personal-lab/config.txt。
容易踩的坑
文件不存在先核对路径;属主解析可能显示数字。macOS stat 参数不同,ACL 与安全模块还可能额外限制访问。
官方参考:GNU stat:文件状态 ↗
Linux 运维#

仅收紧一个私人文件的权限

仅收紧一个私人文件的权限命令示例 · Linux(GNU chmod)
会修改状态
chmod u=rw,go= -- ./personal-lab/config.txt

将属主设为读写并移除组与其他用户权限,仅适用于确实只供本人使用的普通文件;事先确认不是符号链接并记录旧权限。

怎样判断结果
成功通常无输出,再用 stat 核对为 600;相关共享服务可能因此无法读取。
容易踩的坑
失败先查属主与只读挂载,不能通过 sudo 或递归放权绕过;恢复需按之前记录的准确权限操作。
官方参考:GNU chmod:访问权限 ↗
Linux 运维#

解包前审阅归档目录

解包前审阅归档目录命令示例 · Linux(GNU tar)
查询 / 诊断
tar --list --verbose --file=./personal-backup.tar

--list 只列成员,--verbose 显示类型和链接目标,--file 指定可信归档;先核对来源。

怎样判断结果
示意:成员包含 photos/sample.jpg;不是已经解包,也不证明内容可信。
容易踩的坑
格式错误或意外绝对路径、上级路径、链接时停止;列清单也会读取归档并消耗资源,不解析未知恶意大包。
官方参考:GNU tar 官方手册与安全解包 ↗
Linux 运维#

在独立目录创建个人归档

在独立目录创建个人归档命令示例 · Linux(GNU tar、GNU mktemp;POSIX shell)
会修改状态
archive_dir=$(mktemp -d ./archive.XXXXXX) && tar --create --file="$archive_dir/personal.tar" --directory=./personal-lab .

mktemp 创建独立目录;--create 创建归档,--directory 使成员使用相对路径,归档放在源目录外避免自包含。

怎样判断结果
成功通常无输出;终端变量 archive_dir 指向新目录,随后列出其中 personal.tar 验证。
容易踩的坑
创建目录失败则 && 阻止后续;文件读取中发生变化时应保留原始错误并重做一致性备份,不能把半成品当成功。
官方参考:GNU tar 官方手册与安全解包 ↗
Linux 运维#

向新目录安全试解包

向新目录安全试解包命令示例 · Linux(GNU tar、GNU mktemp;POSIX shell)
会修改状态
restore_dir=$(mktemp -d ./restore.XXXXXX) && tar --extract --file=./personal-backup.tar --directory="$restore_dir" --no-same-owner --no-same-permissions --keep-old-files

仅对已审阅可信归档使用;新目录隔离恢复,拒绝覆盖同名文件,不恢复归档所有者,权限受当前 umask 限制;普通用户执行。

怎样判断结果
成功通常无输出;检查 restore_dir 中的文件并抽样打开。
容易踩的坑
失败不重试覆盖;不加 -P,不用 root。此命令不是恶意归档沙箱,磁盘不足或异常链接需停止并检查。
官方参考:GNU tar 官方手册与安全解包 ↗
Linux 运维#

查看指定进程的内存与状态

查看指定进程的内存与状态命令示例 · Linux(/proc、cat)
查询 / 诊断
cat /proc/12345/status

12345 是示例 PID,必须换成已确认属于自己服务的 PID;State、VmRSS、VmSwap、Threads 分别帮助查看状态、常驻内存、交换和线程。

怎样判断结果
示意:State: S (sleeping)、VmRSS: 32768 kB;睡眠不代表故障。
容易踩的坑
不存在可能进程已退出;权限拒绝可能来自 hidepid 或命名空间。PID 会重用,不能用旧记录决定终止进程。
官方参考:Linux kernel:/proc 文件系统 ↗
Linux 运维#

查看系统内存快照

查看系统内存快照命令示例 · Linux(/proc、cat)
查询 / 诊断
cat /proc/meminfo

重点阅读 MemAvailable、MemFree、Cached、SwapFree;这些字段是内核统计,不是某个容器独享的内存额度。

怎样判断结果
示意:MemAvailable: 2048000 kB;只是采样时估计的可用内存。
容易踩的坑
字段因内核版本不同而变化;无 /proc 时先确认环境。不能把 MemFree 小直接判定为泄漏,也不能据此清缓存。
官方参考:Linux kernel:/proc 文件系统 ↗
Linux 运维#

定位进程所在 cgroup

定位进程所在 cgroup命令示例 · Linux(/proc、cat)
查询 / 诊断
cat /proc/12345/cgroup

以自己的实际 PID 替换 12345;cgroup v2 中 0:: 后面是进程分组路径,可继续按实际挂载布局核对 memory.current、memory.max、memory.events。

怎样判断结果
示意:0::/user.slice/example.scope;v1 可有多行控制器路径。
容易踩的坑
容器中路径可能以 / 为根而隐藏宿主层级;不存在或权限拒绝时回到运行环境界面,不能猜路径写入控制文件。
官方参考:Linux kernel:cgroup v2 ↗
Linux 运维#

读取 systemd 服务状态

读取 systemd 服务状态命令示例 · Linux(运行 systemd 的主机)
查询 / 诊断
systemctl --no-pager status personal-app.service

status 显示服务当前状态、主进程及最近日志,--no-pager 避免交互分页;服务名是待替换的个人示例。

怎样判断结果
示意:active (running) 或 failed;非零退出也可能只表示服务未运行。
容易踩的坑
Unit not found 先核对真实单元名;总线连接失败先确认是否在容器中,不能直接安装或启动 systemd。
官方参考:systemd 官方源码手册:systemctl ↗
Linux 运维#

按服务和时间收集日志

按服务和时间收集日志命令示例 · Linux(systemd-journald)
查询 / 诊断
journalctl --no-pager -u personal-app.service --since '30 minutes ago' -n 200

-u 过滤单元,--since 限定时间,-n 限制最多末尾 200 条;日志可能包含路径、请求信息,分享前脱敏。

怎样判断结果
示意:显示这段时间内该单元的日志;没有条目不等于没有错误。
容易踩的坑
权限不足、时区误差、日志未进 journal 或已轮转都可能导致空结果;先确认日志去向,不立即提权导出全机日志。
官方参考:systemd 官方源码手册:journalctl ↗
Linux 运维#

查看本次启动内核告警

查看本次启动内核告警命令示例 · Linux(systemd-journald)
查询 / 诊断
journalctl --no-pager -k -b -p warning -n 100

-k 选内核,-b 选本次启动,-p warning 包含 warning 及更严重级别,-n 限制条数。

怎样判断结果
示意:可能看到 I/O 或内存相关告警;具体文字依驱动和内核而异。
容易踩的坑
受日志权限与保存策略影响;空输出不能排除 OOM 或硬件故障。出现 I/O 错误先保护数据,不反复重启测试。
官方参考:systemd 官方源码手册:journalctl ↗
Linux 运维#

检查 TCP 监听地址与端口

检查 TCP 监听地址与端口命令示例 · Linux(iproute2 ss)
查询 / 诊断
ss -ltnp

-l 监听,-t TCP,-n 数字地址端口,-p 显示可见进程;只查询当前网络命名空间。

怎样判断结果
示意:127.0.0.1:3000 只绑定回环;0.0.0.0:3000 是 IPv4 全地址监听。
容易踩的坑
进程列缺失可能权限不足;监听不等于防火墙放行。容器与宿主需分别判断,不据此自动开放端口。
官方参考:iproute2 官方源码手册:ss ↗
Linux 运维#

查看系统解析链路

查看系统解析链路命令示例 · Linux(systemd-resolved、resolvectl)
查询 / 诊断
resolvectl status

显示全局与各网络链路的 DNS 配置及域路由,帮助辨认 VPN 分流;不更改 DNS。

怎样判断结果
示意:Link 下显示 DNS Servers 与 DNS Domain;真实地址不要公开。
容易踩的坑
服务未运行或命令不存在时应使用发行版网络界面,不修改 resolv.conf;浏览器 DoH 可能另走解析路径。
官方参考:systemd 官方源码手册:resolvectl ↗
Linux 运维#

通过系统解析器查询名称

通过系统解析器查询名称命令示例 · Linux(systemd-resolved、resolvectl)
查询 / 诊断
resolvectl query example.com

query 发起示例公网域名查询,显示地址及解析途径;使用时只替换为自己有权诊断的名称。

怎样判断结果
示意:返回一个或多个 IPv4/IPv6 地址;DNS 查询会产生网络流量。
容易踩的坑
超时先看链路 DNS 与路由;不存在名称和连接超时是不同分支,不用公共 DNS 测公司内部名称。
官方参考:systemd 官方源码手册:resolvectl ↗
Linux 运维#

分辨 HTTP 响应与连接失败

分辨 HTTP 响应与连接失败命令示例 · Linux/macOS(curl)
查询 / 诊断
curl --head --connect-timeout 5 --max-time 15 https://example.com/

--head 请求响应头,两个超时分别限制连接阶段与整个请求;保留默认 TLS 验证。

怎样判断结果
示意:HTTP/2 200 或 301;curl 退出 0 本身不保证 HTTP 状态成功。
容易踩的坑
405 可能服务器不支持 HEAD;证书错误检查时间、域名和证书链,不能用 -k 掩盖;会记录访问日志。
官方参考:curl 官方选项手册 ↗
Linux 运维#

测量单次 HTTP 请求阶段

测量单次 HTTP 请求阶段命令示例 · Linux/macOS(curl)
查询 / 诊断
curl --silent --show-error --output /dev/null --connect-timeout 5 --max-time 15 --write-out 'code=%{http_code} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} first=%{time_starttransfer} total=%{time_total}\n' https://example.com/

发送 GET 并丢弃响应体;计时单位秒,大多是从请求开始累计的节点时间,不能相加。

怎样判断结果
示意:code=200 dns=0.010 connect=0.030 tls=0.080 first=0.120 total=0.125;仅演示格式。
容易踩的坑
请求失败可能 code=000;连接复用、代理和缓存改变计时含义,先核对环境,再做有限次数对照。
官方参考:curl 官方选项手册 ↗
Linux 运维#

不连接主机查看 SSH 有效配置

不连接主机查看 SSH 有效配置命令示例 · Linux/macOS(OpenSSH)
查询 / 诊断
ssh -G -F /dev/null -o HostName=example.com -o User=labuser -o Port=22 personal-lab

-G 展开配置后退出,-F /dev/null 避开个人配置和其中的 Match exec;显式给示例主机用户端口,不发起 SSH 登录。

怎样判断结果
示意:hostname example.com、user labuser、port 22;用于理解配置优先级。
容易踩的坑
不证明目标可连通或账号有效;若改为个人配置,先审阅 Match exec、ProxyCommand 等,不能盲目视作无副作用。
官方参考:OpenSSH ssh(1) 官方手册 ↗
Linux 运维#

查看指定路径所在文件系统容量

查看指定路径所在文件系统容量命令示例 · Linux(GNU df)
查询 / 诊断
df -hT -- ./personal-lab

-h 易读容量,-T 显示文件系统类型;明确路径以避免误看另一块盘。

怎样判断结果
示意:Use% 82%、Avail 20G;是文件系统视角,不是目录大小。
容易踩的坑
不存在先核对挂载;容量还有配额、保留空间等限制。远程挂载可能阻塞,不能由百分比直接决定删除。
官方参考:GNU df:文件系统空间与 inode ↗
Linux 运维#

检查 inode 是否耗尽

检查 inode 是否耗尽命令示例 · Linux(GNU df)
查询 / 诊断
df -i -- ./personal-lab

-i 切换为 inode 使用统计,适合大量小文件导致创建失败的场景。

怎样判断结果
示意:IUse% 100% 而容量仍空闲,提示 inode 可能耗尽。
容易踩的坑
部分文件系统动态分配 inode 或显示特殊值,不能照搬 ext4 结论;确认文件系统类型与实际报错。
官方参考:GNU df:文件系统空间与 inode ↗
Linux 运维#

逐层定位目录占用

逐层定位目录占用命令示例 · Linux(GNU du)
查询 / 诊断
du -x -h --max-depth=1 -- ./personal-lab

-x 限制同一文件系统,-h 易读单位,--max-depth=1 只显示到第一层的汇总;遍历仍会读更深层目录。

怎样判断结果
示意:6.0G ./personal-lab/cache;是分配空间估算,硬链接默认避免重复统计。
容易踩的坑
权限拒绝会低估;大量目录会产生 I/O。macOS 不支持此 GNU 长选项;不要扫描 DSM 系统根目录。
官方参考:GNU du:目录占用统计 ↗
Linux 运维#

预演复制目录内容

预演复制目录内容命令示例 · Linux/macOS 客户端(rsync,先核对版本)
查询 / 诊断
rsync -anvi -- ./personal-lab/ ./backup-preview/

-a 归档模式、-n 不实际传输、-v 明细、-i 逐项变化;源尾斜杠表示复制内容,目标也以目录形式明确。

怎样判断结果
示意:>f+++++++++ notes.txt 表示计划新增文件;不是已经备份成功。
容易踩的坑
路径写反会反转意图;无输出未必全面一致。-a 不包含 ACL、扩展属性和硬链接的全部保留,需要另核验。
官方参考:rsync 官方手册 ↗
Linux 运维#

将个人目录复制到新目标

将个人目录复制到新目标命令示例 · Linux/macOS 客户端(rsync、mktemp;POSIX shell)
会修改状态
backup_dir=$(mktemp -d ./backup.XXXXXX) && rsync -avi -- ./personal-lab/ "$backup_dir/"

创建唯一的新目标目录再复制,-a 尽力保留基本元数据,-v/-i 显示变化;先执行对应 dry-run 并确认源目录。

怎样判断结果
示意:出现文件清单,退出 0 表示本次 rsync 完成;还需内容与恢复验收。
容易踩的坑
空间不足或部分文件传输失败时保留目标待检查;没有 --delete。不同文件系统可能无法保留属主或权限。
官方参考:rsync 官方手册 ↗
Linux 运维#

计算恢复文件的 SHA-256

计算恢复文件的 SHA-256命令示例 · Linux(GNU sha256sum)
查询 / 诊断
sha256sum -- ./personal-lab/sample.txt ./restored/sample.txt

分别计算两个文件内容摘要,人工比较前面的 64 位十六进制值;文件名不同不影响摘要。

怎样判断结果
示意:两行摘要相同才支持这两个文件字节内容一致;本文不提供虚构校验值。
容易踩的坑
读取失败不能跳过;摘要不比较权限、ACL 或来源可信度。文件持续变化时应先冻结测试样本。
官方参考:GNU Coreutils 官方手册 ↗
群晖与备份#

识别 Mac 外接旧盘

识别 Mac 外接旧盘命令示例 · macOS 客户端(Apple diskutil;不是 NAS SSH)
查询 / 诊断
diskutil list external physical

只列外接物理磁盘与分区,辅助核对容量和连接关系;不会初始化磁盘。

怎样判断结果
示意:/dev/diskN (external, physical);N 是示意,不能复制到写盘命令。
容易踩的坑
未发现设备先看线缆、供电和磁盘工具;设备号重插可变,不能作为长期身份。输出含卷名需脱敏。
官方参考:Apple macOS 随系统 diskutil 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

查看 Mac 上已挂载的旧盘卷

查看 Mac 上已挂载的旧盘卷命令示例 · macOS 客户端(Apple diskutil;本地外接卷)
查询 / 诊断
diskutil info /Volumes/ArchiveTest

ArchiveTest 是预先在 Finder 确认的本地外接卷;读取文件系统、容量、只读状态及设备关联。

怎样判断结果
示意:File System Personality 与 Volume Read-Only;字段依版本和格式不同。
容易踩的坑
路径不存在先查 Finder;SMB 共享不是本地块设备,不套用此命令。USB 桥显示不支持 SMART 不代表健康。
官方参考:Apple macOS 随系统 diskutil 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

验收从 NAS 恢复到 Mac 的文件

验收从 NAS 恢复到 Mac 的文件命令示例 · macOS 客户端(随系统 shasum)
查询 / 诊断
shasum -a 256 ./personal-sample/photo.jpg ./restore-check/photo.jpg

-a 256 指定 SHA-256,比较两个本地样本的摘要;无需 NAS 管理权限。

怎样判断结果
示意:两行 64 位摘要相同,表示所读内容一致。
容易踩的坑
找不到文件检查导出位置;不能证明整库、权限或未来介质可靠。请只用个人无敏感样本。
官方参考:Apple macOS 随系统 shasum 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

估计 Mac 个人备份源大小

估计 Mac 个人备份源大小命令示例 · macOS 客户端(Apple du)
查询 / 诊断
du -sk ./personal-sample

-s 汇总,-k 以 1024 字节单位估计分配空间;用于容量预算,不代表逻辑大小或压缩后备份大小。

怎样判断结果
示意:10240 ./personal-sample,约 10 MiB 分配空间。
容易踩的坑
权限拒绝、占位云文件会使估算不完整;大目录查询会读元数据,不能只按此数值承诺保留天数。
官方参考:Apple macOS 随系统 du 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

读取 Mac 已挂载备份共享的容量

读取 Mac 已挂载备份共享的容量命令示例 · macOS 客户端(Apple df;Finder 已挂载 SMB 共享)
查询 / 诊断
df -h /Volumes/BackupCheck

只读查询已确认挂载路径;-h 易读显示共享端返回的容量信息。

怎样判断结果
示意:Capacity 70%;它可能反映服务端卷或用户配额视图。
容易踩的坑
共享未挂载时先回 Finder 确认,不能在同名本地目录继续备份;以 DSM 任务与配额界面交叉核对。
官方参考:Apple macOS 随系统 df 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

比较个人样本与普通备份目录

比较个人样本与普通备份目录命令示例 · macOS/Linux 客户端(rsync;不用于 .hbk 或 sparsebundle)
查询 / 诊断
rsync -rnic -- ./personal-sample/ ./restore-check/

-r 递归、-n dry-run、-i 显示变化、-c 依据内容校验比较;尾斜杠比较源的内容,不写目标。

怎样判断结果
示意:>f 表示源文件相对目标需要更新;无输出仅说明源侧选中文件无需更新。
容易踩的坑
没有 --delete,因此不报告目标多出的文件;-c 会完整读取内容。不得对运行中的备份仓库做目录级比较。
官方参考:rsync 官方手册 ↗
群晖与备份#

准备独立恢复验收目录

准备独立恢复验收目录命令示例 · macOS 客户端(Apple mktemp;在个人工作目录)
会修改状态
mktemp -d ./restore-check.XXXXXX

-d 新建唯一目录;用输出路径作为 Hyper Backup Explorer 导出目的地,避免覆盖现有文件。

怎样判断结果
示意:./restore-check.A1b2C3;实际名称随机生成,需在后续步骤使用实际路径。
容易踩的坑
创建失败检查当前目录写权限和空间;不要改到系统目录或沿用已含资料的恢复目录。
官方参考:Apple macOS 随系统 mktemp 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

逐字节比较两个恢复样本

逐字节比较两个恢复样本命令示例 · macOS 客户端(Apple cmp、POSIX shell)
查询 / 诊断
cmp -s ./personal-sample/notes.txt ./restore-check/notes.txt
compare_status=$?
printf 'cmp_exit=%s\n' "$compare_status"

-s 不显示文件内容,立即记录退出码;只读取两个指定的普通文件。

怎样判断结果
示意:cmp_exit=0 表示相同,1 表示不同,大于 1 表示读取等错误。
容易踩的坑
执行别的命令后再读 $? 会丢失结果;相同不包括权限或扩展属性。路径中的样本须已恢复到对应位置。
官方参考:Apple macOS 随系统 cmp 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

核对恢复文件大小与权限

核对恢复文件大小与权限命令示例 · macOS 客户端(Apple stat)
查询 / 诊断
stat -f '%N | bytes=%z | mode=%Sp | uid=%u gid=%g' ./restore-check/notes.txt

-f 为 BSD/macOS 格式,显示名称、字节数、权限、数字身份;便于与恢复前私人记录对照。

怎样判断结果
示意:bytes=128 | mode=-rw-------;仅展示格式,不是已测结果。
容易踩的坑
不能使用 GNU 的 -c;不同机器 UID 可不同,Mac 导出元数据也不能代替 DSM 原生权限恢复验收。
官方参考:Apple macOS 随系统 stat 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

核对 Time Machine 已配置目的地

核对 Time Machine 已配置目的地命令示例 · macOS 客户端(Apple tmutil)
查询 / 诊断
tmutil destinationinfo

列出备份目的地名称、类型和可能的 URL;仅查看配置,不触发备份。

怎样判断结果
示意:Kind: Network;有目的地不代表最近备份完成。
容易踩的坑
可能暴露用户名、服务器和唯一 ID,分享前删除;无目的地时在系统设置中重新检查已授权配置。
官方参考:Apple macOS 随系统 tmutil 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

查询个人文件是否被排除

查询个人文件是否被排除命令示例 · macOS 客户端(Apple tmutil)
查询 / 诊断
tmutil isexcluded ./personal-sample/notes.txt

isexcluded 查询给定个人路径的 Time Machine 排除状态,不修改排除规则。

怎样判断结果
示意:[Included] 表示未被排除,[Excluded] 表示被排除;未排除不证明已入备份。
容易踩的坑
先确认路径存在,再在 Time Machine 选项核对;权限限制时先用系统界面,不直接扩大终端授权。
官方参考:Apple macOS 随系统 tmutil 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗
群晖与备份#

列出本地 Time Machine 快照

列出本地 Time Machine 快照命令示例 · macOS 客户端(Apple tmutil;APFS 源卷)
查询 / 诊断
tmutil listlocalsnapshots /

列出指定卷的本地 Time Machine 快照名称;不创建、不删除快照。

怎样判断结果
示意:com.apple.TimeMachine.日期.local;只说明本地存在恢复点。
容易踩的坑
空列表可能没有可见快照;本地快照不代表 NAS 备份成功,不依据列表批量清除 APFS 快照。
官方参考:Apple macOS 随系统 tmutil 手册(已查阅 /usr/share/man;链接为官方终端手册入口) ↗