-
开启 TypeScript noUncheckedIndexedAccess 后,数组下标读取会带上 undefined。本文按规则、循环、索引判断和迁移边界说明怎样选择 for-of、边界检查、默认值与非空断言。
-
Vite 的 import.meta.env 主要在开发服务器启动或生产构建阶段读取并静态替换,浏览器运行时不能直接改写已经打包的值。本文解释构建期配置与运行时配置的边界,并给出外置 config.js 的落地方式。
-
Vite 依赖预构建异常时,先区分 node_modules/.vite 文件系统缓存和浏览器强缓存,再用日志、Network 和 --force 选择最小恢复动作。
-
Bash 管道默认只返回最后一个命令的状态,容易掩盖中间失败。本文说明如何启用 pipefail,让失败状态传到管道外层,并用 PIPESTATUS 区分各段命令,同时处理 set -e 和预期失败的边界。
-
Linux 定时任务不只是表达式选择:本文从日志、服务依赖、错过执行、失败处理和任务重叠几个边界比较 cron 与 systemd timer,并给出两套最小配置。
-
Linux 出现内存不足时,OOM killer 会在内核日志中留下被选进程线索。本文从 journalctl 和 dmesg 入手,说明怎样提取 pid、进程名、命令行与 cgroup 归属,并区分节点级内存压力和容器局部超限,避免只重启服务却没有解决根因。
-
Linux perf stat 适合先用 cycles、instructions、分支和缓存指标建立 CPU 性能基线。本文说明怎样选择第一组事件、理解 IPC 与 cache-misses、识别事件不可用和计数器复用,并用重复测量把指标连接到下一步排查动作。
-
Linux PID namespace 的 init 进程不仅是命名空间里的 PID 1,还承担孤儿进程接管和子进程回收职责。本文从进程可见性、SIGCHLD、waitpid、/proc 和 namespace init 退出边界说明怎样避免僵尸进程,并给出最小可读的回收代码。
-
Linux 监听 socket 的 backlog 不是一条队列:SYN_RECV 侧对应未完成握手的请求,accept 队列对应已建立但尚未被应用取走的连接。本文结合 ss、tcp_max_syn_backlog、somaxconn 和 listen(backlog) 说明怎样判断两侧压力。
-
Linux epoll 的 LT 模式在复杂协议、连接状态较多或团队更重视排障时通常更易维护。本文比较 LT 与 ET 的触发语义、非阻塞契约、工作预算和关闭清理边界,给出服务端事件循环的选择依据。
-
Linux inotify 大规模监听应先缩小目录范围,再分别预算 watch、instance 和队列资源。本文说明目录级迁移、fdinfo 计数、事件合并、溢出恢复与回归场景,避免只提高限制却继续丢事件。
-
journalctl 的 --boot 负责选择启动批次,--priority 负责选择消息级别。本文用组合命令筛出启动期间的错误日志,并说明服务、内核、时间窗口、权限和空结果的处理边界。
-
讲清 Linux fanotify 权限事件的初始化、目录标记、用户态策略判断和 FAN_ALLOW/FAN_DENY 响应边界。
-
Linux 启动变慢时,systemd-analyze critical-chain 可以沿着目标单元的关键依赖链找出等待位置。本文按启动总览、关键链、blame、status 和 journalctl 的顺序排查,区分依赖等待与服务自身初始化耗时,并保留回滚路径。
-
Type=notify 不把进程启动当成服务就绪,而是等待服务通过 NOTIFY_SOCKET 发送 READY=1。本文用一个最小 Python 服务和 unit 文件说明通知时机、NotifyAccess=main、检查命令、启动超时与回滚边界。