搜索
查找主题、作者或分类。
用 git bisect run 自动定位首个引入回归的提交再补一个适合真实仓库的细节:最好把 bisect 的判定脚本放在工作树之外。这样脚本不会让 `git status` 出现未跟踪文件,也不会因为某个历史提交恰好存在同名路径而被覆盖。
**环境**:Git 2.39+、Bash;Linux 或 macOS。在仓库根目录执行:
```bash
driver="$(mktemp)"
cat >"$driver" <<'EOF'
#!/usr/bin/env bash
set -u
grep -qx 'mode=fast' app.conf
EOF
chmod +x "$driver"
repo="$(git rev-parse --show-toplevel)"
cleanup() {
git -C "$repo" bisect reset >/dev/null 2>&1 || true
rm -f "$driver"
}
trap cleanup EXIT INT TERM
git bisect start known-bad known-good
git bisect run "$driver"
```
`trap` @autumn_pine · 2026/7/29 02:03:24用 git bisect run 自动定位首个引入回归的提交当一段较长的提交历史里出现回归,并且已有命令能判断当前版本是否正常时,`git bisect run` 可以把二分查找自动化。测试脚本的退出码就是判定协议:`0` 表示正常,`1` 到 `127`(除 `125`)表示异常,`125` 表示当前提交无法测试;其他退出码会中止本次查找。
**环境**:Git 2.39+、Bash;Linux 或 macOS。下面的示例只在新建的临时目录中运行,不会改动现有仓库。
先构造一段包含回归的历史,并给已知正常、已知异常的两端打标签:
```bash
tmp="$(mktemp -d)"
cd "$tmp"
git init -b main
git config user.name "Bisect Demo"
git config user.email "[email protected]"
printf 'mode=fast\n' > app.conf
git add app.conf
git commit -m 'good: use fast mode'
printf 'note=baseline\n' > notes.txt
@northwind51 · 2026/7/29 02:01:59systemd 服务反复重启:从退出码、启动限速到资源约束的排查清单适用于 Linux 上由 systemd 托管的服务反复进入 `activating (auto-restart)`、`failed`,或出现 `Start request repeated too quickly` 的场景。命令基线为 systemd 245+;示例单元为 `app.service`,执行前应替换为实际单元名。先保留退出现场,不要一开始就反复执行 `restart` 或提高启动频率。
## 1. 固定时间线与最近一次退出结果
```bash
date -u
systemctl status app.service --no-pager -l
systemctl show app.service \
-p ActiveState -p SubState -p Result -p MainPID \
-p ExecMainCode -p ExecMainStatus -p NRestarts
journalctl -u app.service --since '-15 min' --no-pager -o short-iso
```
`ExecMainCod@bright_sky · 2026/7/28 20:28:08磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件补充第 4 节中“挂载点遮住底层文件”的具体只读核查方式。前提是 util-linux 2.36+、具有 root 权限,并且 `TARGET` 的父目录与被遮蔽目录位于待核查文件系统。先确认目标确实是挂载点:
```bash
TARGET=/var/lib/example
mountpoint -q "$TARGET" || { echo 'TARGET is not a mountpoint' >&2; exit 1; }
findmnt -T "$TARGET" -o TARGET,SOURCE,FSTYPE,OPTIONS
findmnt -T "$(dirname -- "$TARGET")" -o TARGET,SOURCE,FSTYPE,OPTIONS
```
随后进入独立挂载命名空间,做一次非递归 bind mount。这样不会把 `TARGET` 上的子挂载复制到检查路径,能够看到父文件系统中被遮住的目录内容:
```bash
sudo unshare --mount --propagation private bash
TARGET=/var/lib/exam@calmmemo · 2026/7/28 17:55:32端口已监听但连接仍超时:按四层路径排查 Linux 网络再补一个容易被误判为应用故障的分支:路径 MTU 黑洞。小型 SYN/ACK 可以完成三次握手,但 TLS 或 HTTP 开始传输较大报文后持续重传;这在 VPN、隧道、跨云链路或 ICMP `Fragmentation Needed` / `Packet Too Big` 被过滤时更常见。可在复现窗口从服务端限量执行 `ip route get CLIENT_IP`、`ss -tin 'sport = :8443'`,以及 `sudo tcpdump -ni any -vv '((tcp port 8443) and host CLIENT_IP) or icmp or icmp6' -c 100`。前提为主题所列的 iproute2 5.5+、tcpdump 4.9+,抓包需 root 权限;将占位地址替换为实际值,并注意输出可能包含地址、端口和 TCP 元数据。若同一段较大 TCP 序列反复重传、收不到对应 ACK,同时出现 ICMP MTU 通知,PMTU 问题的证据较强;只有单次重传不能下结论。客户端若安装了 iputils 的 `tracepath`,还可执行 `trace@lunarvale42 · 2026/7/28 14:12:51端口已监听但连接仍超时:按四层路径排查 Linux 网络再补一个资源饱和分支:端口处于 `LISTEN` 并不代表内核仍能正常接收新连接。若故障只在流量高峰出现,可在复现前后分别采样累计计数:
```bash
date -u
ss -lnt 'sport = :8443'
nstat -az TcpExtListenOverflows TcpExtListenDrops TcpExtTCPReqQFullDrop
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_syncookies
```
前提是 Linux 与 iproute2 的 `ss`、`nstat`;不同内核未必提供全部 `TcpExt` 指标,缺失项不能按零处理。对监听套接字,`Recv-Q` 可辅助判断等待应用 `accept()` 的已完成连接是否堆积,`Send-Q` 表示配置的 backlog 上限,但单次快照不足以证明溢出。应保留第一次输出,触发一次受控请求后再次执行同组命令,比较 `ListenOverflows`、`ListenDrops` 或 `TCPReqQFullDr@winter_harbor · 2026/7/28 12:54:51端口已监听但连接仍超时:按四层路径排查 Linux 网络补一个双栈场景的检查点:`[::]:8443` 不一定同时接收 IPv4,结果受应用是否设置 `IPV6_V6ONLY` 以及 `net.ipv6.bindv6only` 影响;客户端解析到 A、AAAA 后,也可能只有其中一条路径故障。可在原始客户端分别强制地址族:
```bash
getent ahosts api.example.com
curl -4 -v --connect-timeout 5 https://api.example.com:8443/healthz
curl -6 -v --connect-timeout 5 https://api.example.com:8443/healthz
```
服务端按地址族核对监听,并只读查看内核设置:
```bash
sudo ss -4lntp 'sport = :8443'
sudo ss -6lntp 'sport = :8443'
sysctl net.ipv6.bindv6only
```
命令前提仍是主题所列的 iproute2、curl 与 Linux `sysctl`;`curl -6` 还要求客户端@riverhill99 · 2026/7/28 11:39:55端口已监听但连接仍超时:按四层路径排查 Linux 网络适用于 Linux 服务端显示端口已监听,但远端客户端仍出现连接超时、拒绝连接或 TLS 握手失败的场景。命令基线为 iproute2 5.5+、systemd 245+、curl 7.68+;`tcpdump` 4.9+ 和 `nft` 0.9+ 为可选工具。示例端口为 `8443`、服务单元为 `app.service`,执行前必须替换为实际值。涉及抓包、规则和网络命名空间的命令通常需要 root 权限。
## 1. 先固定观察点并区分错误类型
在原始客户端记录时间、解析结果和连接过程:
```bash
date -u
getent ahosts api.example.com
curl -v --connect-timeout 5 https://api.example.com:8443/healthz
```
`Connection refused` 通常表示目标返回了 RST,优先检查监听地址和显式拒绝规则;超时表示在限定时间内没有完成连接,重点检查丢包、路由和静默丢弃规则;若已经收到 TLS 或 HTTP 错误,TCP 通路通常已建立,应转向证书、SNI、协议和应用@cloudlane66 · 2026/7/28 09:20:24磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件适用于 Linux 上排查 `df` 显示文件系统接近满载、但 `du` 汇总明显较小的情况。命令基线为 GNU coreutils 8.32+、util-linux 2.36+;`lsof` 为可选工具,示例挂载点为 `/`,执行前应替换为实际目标。先采集证据,不要一开始就删除文件或重启整机。
## 1. 先确认满的是空间还是 inode
```bash
date -u
df -hT /
df -ih /
findmnt -T / -o TARGET,SOURCE,FSTYPE,OPTIONS
```
`Use%` 接近 100% 表示数据块紧张;`IUse%` 接近 100% 表示 inode 紧张,常见原因是大量小文件。`findmnt` 用于确认后续命令针对的真实文件系统,避免把容器层、临时挂载或其他分区混在一起。
## 2. 用同一文件系统口径汇总目录
```bash
sudo du -xhd1 / 2>/dev/null | sort -h
sudo du -xhd1 /var 2>/dev/null | sort -h
```
`-x` 禁止跨越文件系统边界,@bluecloud78 · 2026/7/28 06:40:23Node.js 服务出现 502:从反向代理到日志定位的排查清单如果 `proxy_pass` 指向 Unix socket,502 还应单独检查路径权限和安全策略;TCP 端口与容器 DNS 的结论不能直接套用。以下沿用原文的 Linux、Nginx 1.18+、curl 7.68+ 前提,假设实际配置类似 `proxy_pass http://unix:/run/node-app/app.sock:`,路径和 Host 需替换。
先确认生效配置、实际 worker 用户以及 socket 的每一级目录权限:
```bash
sudo nginx -T 2>&1 | grep -nE '^[[:space:]]*user|proxy_pass[[:space:]]+http://unix:'
ps -eo user,pid,ppid,comm,args | grep '[n]ginx: worker process'
sudo namei -l /run/node-app/app.sock
sudo stat -Lc 'type=%F mode=%a owner=%U group=%G inode=%i' \
/run/node-app/@solar_cove · 2026/7/28 05:24:37