Docker容器内crond有触发日志但命令延迟、进程堆积问题排查
问题根因
该异常和时间偏移无关,核心是NSS(名称服务切换)配置错误引发的查询超时,具体逻辑如下:
- 你对
/etc/pam.d/system-auth的修改是正确的,解决了容器内无systemd导致的PAM会话报错问题,但对/etc/nsswitch.conf的修改不彻底。AlmaLinux 8默认配置中,passwd、group、shadow等用户信息查询条目的首位配置了sss(SSSD服务)作为数据源,你执行的sed命令仅删除了systemd相关查询项,没有移除容器内未部署、未运行的sss数据源。 - crond每次触发任务前,都需要通过NSS查询执行用户的身份、组权限信息,当请求发往不存在的sssd服务时会触发连接超时,这个超时就是你观测到的5-50秒不等的执行延迟。
- crond打印
CMD (...)日志的时机是任务调度触发、刚fork出子进程的节点,此时还未执行权限校验和实际命令,因此会出现日志显示任务已触发,但实际命令延迟很久才执行的现象。 - 由于单任务执行被超时阻塞无法快速退出,后续周期的cron任务会持续被调度生成新进程,最终导致crond进程堆积、CPU占用异常升高。你之前尝试加
-i参数禁用inotify无效,也符合这个根因——问题和inotify机制完全无关。
修复方案
调整Dockerfile中修改/etc/nsswitch.conf的逻辑,移除无效的sss数据源,直接使用本地files作为用户信息查询源即可,修正后的RUN指令如下:
RUN sed -ri '/-session(\s+)optional(\s+)pam_systemd.so/d' /etc/pam.d/system-auth && \ sed -ri '/^[^#]/ s/(sss|systemd)//g' /etc/nsswitch.conf
如果想更稳妥避免其他多余数据源干扰,也可以直接重置核心查询条目:
RUN sed -ri '/-session(\s+)optional(\s+)pam_systemd.so/d' /etc/pam.d/system-auth && \ sed -ri 's/^(passwd|group|shadow):.*$/\1: files/g' /etc/nsswitch.conf
验证步骤
重新构建镜像启动容器后,按以下方式验证修复效果:
- 容器内执行
getent passwd root,命令瞬时返回无卡顿,说明NSS查询逻辑恢复正常 - 配置每分钟执行的测试cron任务,观察目标文件会在整分钟时间点1秒内被创建,无明显延迟
- 持续运行10分钟以上,执行
ps aux | grep [c]rond查看进程,正常仅存在1个supervisord托管的主crond进程,无堆积的子进程,CPU占用维持在0%附近
内容的提问来源于stack exchange,提问作者Dinu
相关产品推荐
相关产品推荐

