Ubuntu 12.04:pam_motd 有时仅显示部分 MOTD

Ubuntu 12.04:pam_motd 有时仅显示部分 MOTD

这虽然不是什么大问题,但确实让我很恼火。

我们有大量运行 Ubuntu 12.04 (server/amd64) 的机器,我经常通过 ssh 进入这些机器。我们有此版本 Ubuntu 的标准设置,其中有一些/etc/update-motd.d用于构建 MOTD 的脚本,并/etc/pam.d/sshd配置为通过 ssh 登录时打印 MOTD pam_motd.so。我们的 MOTD 脚本都是自定义的(这些机器上没有任何内置的 Ubuntu 脚本),但其他一切都是绝对原始的 Ubuntu 服务器配置。在大多数情况下,这可以正常工作。

但是,偶尔,MOTD 仅显示部分内容(有时根本不显示)。终端或我能找到的任何日志中都没有错误消息,它只是没有显示完整的输出。如果我cat /var/run/motd在发生这种情况后立即执行该文件但是,显示完整(和最新)的输出。

我知道run-parts如果其中一个脚本以 >0 状态退出,则可以选择停止处理脚本,但我不认为这在这种情况下适用——通常输出会被截断在中间脚本执行。例如,一个脚本可能会打印出如下几行:

mycompany header

hostname uname
cpu
ram
uptime

但是 MOTD 会在之后立即停止mycompany header。这些都是非常简单的 bash 脚本,我们没有-e在其中启用该选项,所以我不知道这怎么会发生。起初我以为 PAM 等待 MOTD 生成的时间可能有限制,有时(取决于负载或其他情况)我们可能会达到该限制 - 但事实似乎并非如此。无论是否被截断,MOTD 几乎每次都会立即打印。

我能想到的唯一另一件事是,也许run-parts一次只写出一行动态 MOTD 文件,并且存在某种竞争条件,pam_motd读取该文件的不完整版本。

但是,我无法确认这一点,因为我不知道此功能背后的机制是什么。我的理解是,PAM 会以某种方式run-parts在登录时触发以更新文件,但我找不到任何引用run-parts/etc/update-motd.dPAM 源.pam_motd代码似乎所做的只是读取 MOTD 文件。

我能找到的唯一可能有用的线索是:如果我watch -n 0.1 'ps aux | grep "run-parts"'在一个终端窗口中执行此操作,当我断开连接并在另一个窗口中重新连接到同一主机时,我可以看到,当输出完成时,总会有几个进程在进程列表中非常短暂地出现 - 但是当它被截断时,只有一个或两个进程(有时根本没有)。

编辑:我还应该补充一点,当我手动执行时,我根本无法复制这个问题run-parts --lsbsysinit /etc/update-motd.d;它仅有的似乎发生在 ssh 登录时。

我该如何进一步排除故障?PAM 如何指示系统更新 MOTD?它是等待该过程完成,还是同时运行?有没有办法改变这种行为?我是否可以在某处设置调试选项,至少可以查看正在发生的事情?是否有任何预期的原因可能导致run-parts脚本中途中止?

干杯

相关内容