You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian10环境下nginx.pid每隔数小时被未知进程截断清空如何排查

Nginx PID文件被异常清空排查方案

问题现象

  • Certbot无法自动完成SSL证书续期,排查确认根因为/run/nginx.pid文件为空;手动向该文件写入正确的Nginx主进程PID后,数小时内文件内容仍会被自动清空。
  • 初始使用auditctl对/run/nginx.pid添加文件审计,捕获到如下截断操作发生时的日志:
type=PROCTITLE msg=audit(07/13/22 09:28:44.836:464) : proctitle=/usr/bin/python3 /bin/systemctl 
type=PATH msg=audit(07/13/22 09:28:44.836:464) : item=1 name=/run/nginx.pid inode=969508 dev=00:15 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 
type=PATH msg=audit(07/13/22 09:28:44.836:464) : item=0 name=/run/ inode=8446 dev=00:15 mode=dir,755 ouid=root ogid=root rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 
type=CWD msg=audit(07/13/22 09:28:44.836:464) : cwd=/ 
type=SYSCALL msg=audit(07/13/22 09:28:44.836:464) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7f1b334fcf50 a2=O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC a3=0x1b6 items=2 ppid=18612 pid=18613 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=systemctl exe=/usr/bin/python3.7 subj==unconfined key=(null)
  • 初始排查排除Certbot问题:删除所有Certbot相关定时任务后,文件清空问题仍复现;核查Let's Encrypt日志,事发当日9:28时间点无任何相关操作记录。
  • 从审计日志系统调用参数判断:存在Python3进程以O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC模式打开nginx.pid并截断文件内容,但未写入正确的Nginx进程PID。当前运行环境为Debian 10,需进一步定位执行截断操作的具体进程。

定位操作步骤

  • 优化审计规则,补全缺失的进程上下文
    现有审计规则捕获的信息存在进程名、命令行截断问题,重新添加带标记的细粒度审计规则,捕获完整调用链:
    auditctl -w /run/nginx.pid -p w -k nginx_pid_truncate -F arch=b64
    
    下次触发截断事件后,执行ausearch -k nginx_pid_truncate -i查看解析后的日志,可拿到完整的进程命令行、父进程调用链、可执行文件路径,不会出现proctitle截断的问题。
  • 基于现有日志的PID信息回溯
    现有日志已明确截断操作的进程IDpid=18613、父进程IDppid=18612,如果事件发生时间较短,直接通过/proc文件系统查询进程信息:
    # 若进程尚未退出,直接读取进程命令行
    cat /proc/18613/cmdline | tr '\0' ' '
    cat /proc/18612/cmdline | tr '\0' ' '
    # 若进程已退出,从系统日志中检索对应PID的操作记录
    grep -E '18612|18613' /var/log/syslog /var/log/auth.log
    
    日志中proctitle=/usr/bin/python3 /bin/systemctl为截断内容,Debian10环境下该类操作常见触发源包括:配置错误的Nginx监控探测脚本、logrotate的Nginx轮转规则异常、第三方安全巡检脚本调用systemctl查询Nginx状态时逻辑错误。
  • 全量排查定时执行任务
    不要仅排查root用户的crontab,需覆盖所有定时执行入口:
    # 遍历所有用户的crontab配置
    for user in $(cut -f1 -d: /etc/passwd); do echo "=== User $user crontab ==="; crontab -u $user -l 2>/dev/null; done
    # 检查系统级定时任务目录
    ls -la /etc/cron.hourly/ /etc/cron.d/ /etc/cron.daily/
    # 检查systemd定时器
    systemctl list-timers --all
    
    重点筛选执行周期为小时级、包含Python调用、Nginx状态检查、systemctl操作逻辑的任务。
  • 校验Nginx与系统配置一致性
    排除第三方进程问题后,检查自身配置是否存在异常:
    # 查看Nginx配置中指定的PID文件路径
    nginx -T 2>/dev/null | grep -E '^\s*pid'
    # 查看运行中Nginx主进程实际持有的PID文件句柄
    ls -la /proc/$(ps aux | grep 'nginx: master' | grep -v grep | awk '{print $2}')/fd | grep nginx.pid
    
    若配置的PID路径与实际路径不匹配,Nginx执行reload操作时也可能出现截断文件但未写入PID的问题;同时需检查/usr/lib/tmpfiles.d/下的配置,确认不存在定期清理/run/nginx.pid的规则。

内容的提问来源于stack exchange,提问作者Unicorndog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:12:20