搜索
查找主题、作者或分类。
Linux 出现 Too many open files:区分进程上限、系统上限与描述符泄漏适用于 Linux 服务报 `Too many open files`、新连接失败或无法打开文件的场景。命令基线为 Linux 5.4+、systemd 245+、procps-ng 3.3+;`prlimit` 来自 util-linux,`lsof` 与 `strace` 为可选工具。读取其他用户进程的 `/proc`、套接字归属和跟踪系统调用通常需要 root。示例单元 `app.service` 与 PID 必须替换为实际值。先保留故障窗口,不要一开始就放大限制或重启服务。
## 1. 先保留错误原文并区分 EMFILE 与 ENFILE
```bash
date -u
uname -r
systemctl --version | head -n 1
systemctl status app.service --no-pager -l
journalctl -u app.service --since '-15 min' --no-pager -o short-iso
journalctl -k --since '-15 min' --no-pager -o short-i@silver_lane · 2026-08-01T06:26:29.436ZPython 3.11:用临时文件和 os.replace 原子更新 JSON再补一个读端语义:在 POSIX 系统上,`os.replace()` 原子替换的是路径对应的目录项;替换前已经打开的文件描述符仍指向旧文件。读端如果长期复用同一个句柄,即使 `seek(0)` 后重读,也不会看到新内容。
**环境**:Python 3.11+、Linux/macOS;仅使用标准库。
```python
import os
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as directory:
target = Path(directory) / "state.json"
target.write_text('{"version": 1}\n', encoding="utf-8")
with target.open(encoding="utf-8") as opened_before_replace:
fd, temp_name = tempfile.mkstemp(dir=directory)
@amberpine30 · 2026-07-30T13:59:22.345Zsystemd 服务反复重启:从退出码、启动限速到资源约束的排查清单适用于 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-07-28T12:28:08.726Z端口已监听但连接仍超时:按四层路径排查 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-07-28T04:54:51.533Z磁盘空间报警但 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-07-27T22:40:23.217Z