Ubuntu 12.04: pam_motd иногда отображает только частичный MOTD
Это не очень большое дело, но это действительно как-то меня раздражает.
У нас есть большое количество машин с Ubuntu 12.04 (server/amd64), на которые я часто захожу. У нас есть стандартная установка для этой версии Ubuntu, где есть несколько сценариев в /etc/update-motd.d
которые используются для построения MOTD, и /etc/pam.d/sshd
настроен на печать MOTD при входе в SSH через 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
может прервать в середине сценария?
ура