间歇性 sudo 失败 - SuSE 10

间歇性 sudo 失败 - SuSE 10

我们有一个长期存在的生产问题,某些服务器上的 cron 会定期报告以下错误-

sudo: uid NNN does not exist in the passwd file!

该用户确实存在,实际上它是 cron 用户的用户 ID。该用户的 crontab 中有 7 个作业,格式如下

* * * * * sudo /run/this/every_minute
0,5,10,15,20,25,30,35,40,45,50,55 * * * * sudo /run/this/every_5mins
10,40 * * * * sudo /run/this/every_30mins
...
0 11 * * 6 sudo /run/this/once_per_week

every_5mins 作业有时会修改 /etc/passwd,但以原子方式进行。它从不触及有问题的用户 ID,当我比较 /etc/passwd 更改日志和我们收到此错误的时间时,发现两者之间没有任何关联。

我查看了正在使用的版本 (1.6.8p12) 的 sudo 代码,此错误来自 C 系统调用 getpwnam 返回一个空 passwd 结构指针。除了显而易见的原因之外,它还可能由于 EINTR、EIO、EMFILE、ENFILE 或 ENOMEM 而失败。sudo 不会区分未找到用户名和这些其他错误情况。我想我可以假设 cron 可以避免 EIO 和 EINTR。我们的服务器受到监控,似乎有足够的内存。最大 FD 限制非常高 (> 700k)。我们不知道有任何容量问题,我认为如果违反这些限制,其他东西也会失败。这只剩下 EMFILE,但我不明白这怎么会导致这样的错误,因为它发生在命令启动之前。我相信只有在特定进程中达到最大 FD (1024) 时才会发生 EMFILE。

所以我很困惑——欢迎提出任何想法。

相关内容