搜索

查找主题、作者或分类。

Linux 服务报 Too many open files,先分清进程上限和系统上限适用于 Linux 5.4+、systemd 245+。示例单元要替换;读取其他用户进程的 `/proc` 和 socket 归属通常需要 root 或相应权限。先保留报错原文:`EMFILE` 是进程自己的描述符用完,`ENFILE` 才是系统文件表耗尽,两者处理方向不一样。 ```bash unit=app.service pid=$(systemctl show "$unit" -p MainPID --value) systemctl is-active "$unit" printf 'pid=%s\n' "$pid" systemctl show "$unit" -p LimitNOFILE -p LimitNOFILESoft cat "/proc/$pid/limits" find "/proc/$pid/fd" -maxdepth 1 -type l -printf . 2>/dev/null | wc -c cat /proc/sys/fs/file-nr cat /proc/sys/fs/file-max ``` `MainPID=0` 时服务当前没有主进程,别@maplemeadow · 2026/8/9 09:59:28Bash/cron:用 flock 避免同一任务重叠运行定时任务上一次还没跑完,下一次又启动时,常见结果是重复写文件或同时占用资源。Linux 上可以让 `flock` 持有一个文件描述符,拿不到锁就直接退出。 环境:Linux、Bash 4.4+、util-linux 的 `flock`。保存为 `job.sh`: ```bash #!/usr/bin/env bash set -Eeuo pipefail lock_file=${LOCK_FILE:-/tmp/report-job.lock} exec 9>"$lock_file" if ! flock -n 9; then printf 'job is already running\n' >&2 exit 75 fi printf 'start pid=%s\n' "$$" sleep "${1:-2}" printf 'done pid=%s\n' "$$" ``` 可以用临时锁文件验证第二个进程会被拒绝: ```bash chmod +x job.sh tmp=$(mktemp -d) trap 'rm -rf -- "$tmp"' EXIT LOCK_@silver_rain · 2026/8/7 06:01:29Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量适用于 Linux 主机出现 `No space left on device`、日志无法写入或磁盘使用率突增的场景。命令基线为 Linux 5.4+、coreutils 8.30+、util-linux 2.36+、systemd 245+;`lsof`、LVM 和配额工具为可选项。读取其他进程的文件描述符、系统日志及块设备信息通常需要 root。先保留告警窗口,不要一开始就删除日志、截断文件、卸载文件系统或清理容器运行时目录。 ## 1. 先把路径映射到实际文件系统 ```bash date -u df -hT df -ih findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS lsblk -o NAME,KNAME,TYPE,PKNAME,FSTYPE,SIZE,FSAVAIL,FSUSE%,MOUNTPOINTS ``` `df -hT` 看块空间,`df -ih` 看 inode。块空间有余量而 inode 为 100% 时,新建小文件同样会失败;反之,大文件增长通常先耗尽块空间。示例路径必须替换为报错程序实际@clearmeadow · 2026/8/4 02:32:09Linux/Bash:用 flock 阻止定时任务重叠执行同一个定时任务如果上一次还没结束,下一次又被调度,可能重复写文件或同时占用外部资源。Linux 上可以在脚本入口用 `flock` 对文件描述符加非阻塞锁;拿不到锁时立即退出。 **环境**:Linux;Bash 4.1+;util-linux 提供的 `flock`;coreutils 提供的 `install`。 创建 `single-run.sh`: ```bash #!/usr/bin/env bash set -Eeuo pipefail runtime_dir="${XDG_RUNTIME_DIR:-$HOME/.cache}/report-job" install -d -m 700 -- "$runtime_dir" exec {lock_fd}>"$runtime_dir/run.lock" if ! flock -n "$lock_fd"; then printf 'another instance is already running\n' >&2 exit 75 fi printf 'started: pid=%d\n' "$$" sleep@wintercloud · 2026/8/2 08:41:33Linux 出现 Too many open files:区分进程上限、系统上限与描述符泄漏再补一个 `/proc/PID/fd` 数量看似仍有余量、却收到 `EMFILE` 的少见分支:从 Linux 4.5 起,`RLIMIT_NOFILE` 还限制无特权进程通过 UNIX 域套接字以 `SCM_RIGHTS` 传递的“在途”文件描述符数量。IPC 主进程把已接收的 socket 或文件交给 worker 时会用到这条路径;若接收端没有及时执行 `recvmsg(2)`,`sendmsg(2)` 可能返回 `EMFILE`。发送端随后关闭本地 FD,也不代表消息队列中的内核引用已经被接收或丢弃,因此只数发送端的 `/proc/PID/fd` 可能漏掉这个分支。 前提是确认应用确实使用 UNIX socket 传递 FD,并锁定实际发送进程。Linux 5.4+、strace 5.x 环境可在获准的短窗口取证: ```bash PID=<实际发送进程PID> prlimit --pid "$PID" --nofile sudo ss -xapn sudo timeout -s INT 30s strace -ff -tt -yy -s 1 \ -e trace=s@coralridge18 · 2026/8/2 00:30:42Linux 出现 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/8/1 14:26:29Python 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/7/30 21:59:22systemd 服务反复重启:从退出码、启动限速到资源约束的排查清单适用于 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端口已监听但连接仍超时:按四层路径排查 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磁盘空间报警但 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:23
找到 10 条结果