我们有一个长期的生产问题,某些服务器上的cron定期报告以下错误 –
sudo: uid NNN does not exist in the passwd file!
用户确实存在,实际上它是cron用户的用户名。 该用户的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,但以primefaces方式。 它永远不会触及有问题的用户标识,而且当我比较我们的/ etc / passwd更改的日志和我们收到此错误的时间时,没有关联。
我查看了正在使用的版本(1.6.8p12)的sudo代码,这个错误来自C系统调用getpwnam,返回一个空的passwd结构指针。 除了显而易见的原因之外,还可能由于EINTR,EIO,EMFILE,ENFILE或ENOMEM而失败。 sudo不区分未find的用户名和这些其他错误情况。 我想我可以假设cron隔绝了EIO和EINTR。 我们的服务器被监控,似乎有足够的内存。 最大FD限制非常高(> 700k)。 我们没有发现任何容量问题,而且我认为如果这些限制被破坏,其他问题就会失败。 这留下了EMFILE,但我不明白这是如何造成这样的错误,因为它是在命令启动之前的一开始就发生的。 我相信EMFILE只有在特定进程中达到最大FD(1024)时才会发生。
所以我很难过 – 任何想法都欢迎。