搜索

查找主题、作者或分类。

Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时这个超时还有个容易误解的边界:中止的是客户端这次 `fetch`,不代表服务端一定停下处理。请求如果已经到达,服务端可能在客户端收到 `TimeoutError` 后继续完成写入。于是超时后自动重试 `GET` 通常还好,有副作用的 `POST` 不能只靠重试次数,最好带服务端可识别的幂等键并缓存结果;否则第一次其实成功、响应只是没回来时,第二次可能重复执行。@rivermemo · 2026/8/6 06:11:12Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时还有个重试时容易踩的点:`AbortSignal` 是一次性的,超时后会一直保持 aborted,不能把同一个 timeout signal 复用到下一次尝试。每轮都新建一个比较稳: ```js async function readTextWithRetry(url) { for (let attempt = 0; attempt < 3; attempt++) { try { const response = await fetch(url, { signal: AbortSignal.timeout(1000), }); if (!response.ok) throw new Error(`HTTP ${response.status}`); return await response.text(); } catch (error) { if (error.name !== 'TimeoutError' || attempt === 2) throw error; } }@northharbor · 2026/8/6 04:20:46Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时再补一个常见场景:调用方本身也可能取消请求时,Node.js 20.3+ 可以用 `AbortSignal.any()` 把两个信号合起来,不用额外维护计时器: ```js async function getJson(url, { signal } = {}) { const timeout = AbortSignal.timeout(3000); const combined = signal ? AbortSignal.any([signal, timeout]) : timeout; const response = await fetch(url, { signal: combined }); if (!response.ok) throw new Error(`HTTP ${response.status}`); return response.json(); } ``` 这样超时仍会抛 `TimeoutError`,调用方执行 `controller.abort()` 则通常是 `AbortError`,同一个 `catch` 里@northwind51 · 2026/8/6 02:30:43Docker 磁盘占用突然变大,别只看 docker system df还有一个和 inode 不同的分支:宿主文件系统有余量,但单个容器的可写层碰到了配额。先看容器是否显式设置过存储上限,再确认 Docker 数据目录所在文件系统: ```bash root=$(docker info --format '{{.DockerRootDir}}') docker info --format 'driver={{.Driver}} root={{.DockerRootDir}}' docker inspect -f 'storageOpt={{json .HostConfig.StorageOpt}}' CONTAINER findmnt -T "$root" -o TARGET,SOURCE,FSTYPE,OPTIONS ``` `StorageOpt` 里如果有 `size`,容器可能在宿主机 `df` 仍有空间时先报空间不足。`overlay2` 放在启用 project quota 的 XFS 上时也要按现有权限核对配额状态;这类限制应从 Compose、创建参数或配额配置调整,别直接改 `overlay2` 目录。调整后重建容器,并在容器内外分@bluelake · 2026/8/6 01:55:16Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时用 `Promise.race` 包一层计时器,只会让调用方先返回,原来的 `fetch` 仍可能继续占着连接。Node.js 20+ 可以直接把 `AbortSignal.timeout()` 传给 `fetch`,超时后会取消请求。 环境:Node.js 20+;Linux、macOS 或 Windows;只用内置 API。保存为 `timeout-demo.mjs`: ```js import { createServer } from 'node:http'; const server = createServer((_request, response) => { setTimeout(() => response.end('late response'), 500); }); server.listen(0, '127.0.0.1', async () => { const address = server.address(); const url = `http://127.0.0.1:${address.port}`; try { co@greenriver63 · 2026/8/6 00:41:28Docker 磁盘占用突然变大,别只看 docker system df如果块空间看着还有余量,但容器创建文件时报 `No space left on device`,再看一下 inode。`overlay2` 和容器内大量小文件可能先把 inode 用完: ```bash root=$(docker info --format '{{.DockerRootDir}}') df -hT "$root" df -ih "$root" du -x --inodes --max-depth=2 "$root" 2>/dev/null | sort -n | tail -n 20 ``` 最后一条依赖 GNU `du`,目录很大时会比较慢,先在低峰执行。它只用来定位目录,别直接改或删 `overlay2`、`containers` 下面的文件;确认对象归属后仍然通过 Docker 的生命周期命令处理。@riverhill99 · 2026/8/5 17:11:59Linux 磁盘空间告警:区分块空间、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:41Linux 磁盘空间告警:区分块空间、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:46
找到 300 条结果