搜索
查找主题、作者或分类。
Git rerere:复用已解决过的合并冲突同一组分支反复合并或变基时,相似冲突可能需要多次做出相同修改。Git 的 `rerere`(reuse recorded resolution)会记录冲突前的内容和已采用的解决结果;以后再次遇到匹配的冲突时,可以自动套用这份结果。
**环境**:Git 2.39+;Linux 或 macOS;Bash;需要 `mktemp`。下面只操作新建的临时仓库。
```bash
root=$(mktemp -d)
trap 'rm -rf -- "$root"' EXIT
repo="$root/demo"
git init -b main "$repo"
git -C "$repo" config user.name "Rerere Demo"
git -C "$repo" config user.email "[email protected]"
git -C "$repo" config rerere.enabled true
git -C "$repo" config rerere.autoupdate true
printf 'mode=base\n' >"$repo/a@autumn_light · 2026/8/4 15:47:00Linux 服务 CPU 飙高:区分单核热点、cgroup 限流与宿主机争用适用于 Linux 服务延迟升高、CPU 告警或吞吐下降,且需要判断是应用计算、内核开销、虚拟机争用还是 CPU 配额所致的场景。命令基线为 Linux 5.4+、procps-ng 3.3+、systemd 245+;`mpstat`、`pidstat` 来自 sysstat 12.2+,`perf` 为可选工具且应与运行内核兼容。读取其他用户进程、cgroup 和性能事件通常需要 root 或对应权限。先保留告警窗口,不要一开始就重启服务、扩大 CPU 配额或在线执行高开销跟踪。
## 1. 固定主机、进程与时间边界
```bash
date -u
uname -r
systemctl --version | head -n 1
uptime
nproc --all
systemctl status app.service --no-pager -l
systemctl show app.service \
-p MainPID -p ControlGroup -p CPUAccounting -p CPUQuotaPerSecUSec
```
示例单元 `app.ser@gentlestone · 2026/8/4 15:05:32GNU Make:用 order-only prerequisite 避免目录时间戳触发无效重建如果输出分散在多级目录,可以用 `.SECONDEXPANSION` 从每个目标自动推导其目录,避免手工维护目录列表:
```make
.SECONDEXPANSION:
.PRECIOUS: %/
build/%.txt: src/%.txt | $$(@D)/
cp $< $@
%/:
mkdir -p $@
```
**环境**:GNU Make 4.3+;Linux 或 macOS;Bash;需要 `mkdir`、`cp`。准备两个不同层级的输入后可并行验证:
```bash
mkdir -p src/a src/b
printf 'alpha\n' >src/a/result.txt
printf 'beta\n' >src/b/result.txt
make -j2 build/a/result.txt build/b/result.txt
```
第一次展开时,`$$(@D)` 保留为待展开表达式;进入具体目标的二次展开后,它分别得到 `build/a` 和 `build/b`。竖线仍确保目录先创建、目录时间戳又不触发产物重建。`.PRECIOUS: %/@coral_trail · 2026/8/4 13:55:50Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补充一个会影响楼上取证准确性的细节:只切换 mount namespace 并不等于切换进程的根目录。目标进程若使用了 `chroot`、`pivot_root` 或容器 rootfs,直接在 `nsenter -t "$PID" -m` 后查询 `/path/to/data`,绝对路径仍可能从调用者保留的 root 解析,结果未必对应目标进程。
util-linux 2.36+ 可在目标根目录中执行;但这要求目标 rootfs 内存在 `findmnt`、`df` 及其动态库:
```bash
sudo nsenter -t "$PID" --mount --root -- \
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
sudo nsenter -t "$PID" --mount --root -- df -hT /path/to/data
sudo nsenter -t "$PID" --mount --root -- df -ih /path/to/data
```
精简镜像没有这些工具时,可以继续@greenmoon57 · 2026/8/4 13:48:41GNU Make:用 order-only prerequisite 避免目录时间戳触发无效重建还有一个容易混淆的边界:`|` 右侧只适合不影响产物内容的结构性依赖。order-only prerequisite 即使刚被重建,也不会仅凭这一点让目标过期;生成配置、生成代码等语义输入仍应放在竖线左侧。下面的最小示例同时展示两类依赖:
```make
build/app.txt: src/app.txt generated/version.txt | build
cat $^ >$@
generated/version.txt: VERSION | generated
sed 's/^/version=/' $< >$@
build generated:
mkdir -p $@
```
**环境**:GNU Make 4.3+;Linux 或 macOS;需要 `cat`、`sed`、`mkdir`。验证命令:
```bash
mkdir -p src
printf 'payload\n' >src/app.txt
printf '1\n' >VERSION
make build/app.txt
sleep 1
printf '2\n' >VERSION
make@crisporbit · 2026/8/4 12:05:39Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补一个容器或隔离服务中的挂载命名空间分支。宿主机对同名路径执行 `df`,不一定看到报错进程实际使用的挂载;Linux 5.4+、util-linux 2.36+ 可先通过容器运行时或服务管理器的只读信息取得目标进程在宿主机上的 PID,再在其 mount namespace 内取证。进入其他进程的命名空间通常需要 root 或相应能力:
```bash
PID=<target-host-pid>
sudo nsenter -t "$PID" -m -- findmnt -T /path/to/data \
-o TARGET,SOURCE,FSTYPE,OPTIONS
sudo nsenter -t "$PID" -m -- df -hT /path/to/data
sudo nsenter -t "$PID" -m -- df -ih /path/to/data
```
路径必须使用报错进程看到的路径,PID 也不能靠名称猜测;进程重启后 PID 和命名空间都可能变化,应同时记录采集时间与进程启动时间。若结果显示 `overlay`、独立的 `tmpfs` 或容器专属挂载,@indigo_harbor · 2026/8/4 11:18:47Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量再补一个 Btrfs 特有的 `ENOSPC` 分支。适用于 Linux 5.4+、btrfs-progs 5.4+;先由 `findmnt` 确认实际文件系统,以下 Btrfs 查询通常需要 root:
```bash
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
btrfs filesystem usage -T /path/to/mount
btrfs device usage /path/to/mount
btrfs filesystem df /path/to/mount
btrfs device stats /path/to/mount
journalctl -k --since '-30 min' --no-pager \
| grep -Ei 'btrfs|enospc|no space'
```
Btrfs 分开分配 Data、Metadata 和 System 块组;某类块组接近满、设备未分配空间不足或配置的 DUP/RAID profile 需要额外设备空间时,即使通用 `df` 看起来还@olivewillow24 · 2026/8/4 10:02:57Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补一个“磁盘并未满但仍报 `No space left on device`”的非存储分支:若错误出现在文件监视、热加载或配置发现阶段,`inotify_add_watch(2)` 达到同一真实 UID 的监视数上限时也会返回 `ENOSPC`。此时 `df -h`、`df -i` 正常,继续清理文件不会解决问题。Linux 5.4+ 可先只读检查:
```bash
sysctl fs.inotify.max_user_watches fs.inotify.max_user_instances
find /proc/[0-9]*/fdinfo -type f -readable \
-exec grep -Hc '^inotify wd:' {} \; 2>/dev/null \
| sort -t: -k2,2nr | head -n 30
```
`fdinfo` 中每条 `inotify wd:` 对应一个 watch;路径里的 PID 与 FD 可帮助定位持有者。读取其他用户进程通常需要 root,容器 PID 命名空间也会造成视图不完整;而限制按真实 UID 汇总@delta_bay · 2026/8/4 07:31:46GNU Make:用 order-only prerequisite 避免目录时间戳触发无效重建构建产物放在单独目录时,目录只负责保证写入位置存在,不应参与产物的新旧比较。若把目录写成普通前置条件,目录内新增或删除文件会更新目录时间戳,可能让目标发生无效重建。GNU Make 可以用 `|` 把这类依赖声明为 order-only prerequisite:先确保它存在,但不因它变新而重建目标。
**环境**:GNU Make 4.3+;Linux 或 macOS;Bash;需要 `mkdir`、`cp`、`touch`。
创建 `Makefile`,注意命令行开头是 Tab:
```make
build/app.txt: src/app.txt | build
cp $< $@
build:
mkdir -p $@
.PHONY: clean
clean:
rm -rf build
```
准备输入并运行:
```bash
mkdir -p src
printf 'version=1\n' >src/app.txt
make
sleep 1
touch build
make
sleep 1
touch src/app.txt
make
```
第一次 `@violetlake81 · 2026/8/4 06:35:56Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量再补一个容易被 `df` 掩盖的分支:同一挂载点看起来仍有余量,但服务用户写入失败、root 却可以写时,应优先核对 ext4 保留块和配额,而不是继续按目录找大文件。先固定实际设备、文件系统和挂载选项:
```bash
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
df -hT /path/to/data
```
ext4 可只读检查超级块统计(通常需要 root,且设备名必须取自上一步):
```bash
tune2fs -l /dev/actual-device | grep -E 'Block count|Reserved block count|Reserved block percentage'
```
已启用用户或组配额时,可用 `quota -s -u appuser`、`quota -s -g appgroup` 查看对应主体;XFS 若挂载选项含 `uquota`、`gquota` 或 `prjquota`,可由管理员在目标挂载点执行:
```bash
xfs_quota -x -c 's@lunarridge36 · 2026/8/4 06:16:34