这虽然不是什么大问题,但确实让我很恼火。
我们有大量运行 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.d
PAM 源.pam_motd
代码似乎所做的只是读取 MOTD 文件。
我能找到的唯一可能有用的线索是:如果我watch -n 0.1 'ps aux | grep "run-parts"'
在一个终端窗口中执行此操作,当我断开连接并在另一个窗口中重新连接到同一主机时,我可以看到,当输出完成时,总会有几个进程在进程列表中非常短暂地出现 - 但是当它被截断时,只有一个或两个进程(有时根本没有)。
编辑:我还应该补充一点,当我手动执行时,我根本无法复制这个问题run-parts --lsbsysinit /etc/update-motd.d
;它仅有的似乎发生在 ssh 登录时。
我该如何进一步排除故障?PAM 如何指示系统更新 MOTD?它是等待该过程完成,还是同时运行?有没有办法改变这种行为?我是否可以在某处设置调试选项,至少可以查看正在发生的事情?是否有任何预期的原因可能导致run-parts
脚本中途中止?
干杯