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=b64ausearch -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.logproctitle=/usr/bin/python3 /bin/systemctl为截断内容,Debian10环境下该类操作常见触发源包括:配置错误的Nginx监控探测脚本、logrotate的Nginx轮转规则异常、第三方安全巡检脚本调用systemctl查询Nginx状态时逻辑错误。 - 全量排查定时执行任务
不要仅排查root用户的crontab,需覆盖所有定时执行入口:
重点筛选执行周期为小时级、包含Python调用、Nginx状态检查、systemctl操作逻辑的任务。# 遍历所有用户的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 - 校验Nginx与系统配置一致性
排除第三方进程问题后,检查自身配置是否存在异常:
若配置的PID路径与实际路径不匹配,Nginx执行reload操作时也可能出现截断文件但未写入PID的问题;同时需检查# 查看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/usr/lib/tmpfiles.d/下的配置,确认不存在定期清理/run/nginx.pid的规则。
内容的提问来源于stack exchange,提问作者Unicorndog
相关产品推荐
相关产品推荐

