我在同一个 [Ubuntu 10.04] 服务器上运行 jenkins 和 gitosis。Jenkins 从 gitosis 提供的 repo(也在同一台服务器上运行)获取 git 提交。实际上,有很多 repo,因为 Jenkins 中有很多作业。时不时地,我会遇到一个僵尸who
进程,其根本原因似乎是一些用于更新 /etc/motd 的 Ubuntu 特定脚本。这是今天早些时候进程表(的一部分)的样子:
jenkins 30042 1 0 Mar19 ? 00:00:00 git fetch -t [email protected]:testRepo.git +refs/heads/*:refs/remotes/origin/*
jenkins 30060 30042 0 Mar19 ? 00:00:00 ssh [email protected] git-upload-pack 'testRepo.git'
root 30066 703 0 Mar19 ? 00:00:00 sshd: gitosis [priv]
root 30096 30066 0 Mar19 ? 00:00:00 sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /bin/run-parts --lsbsysinit /etc/update-motd.d > /var/run/motd.new
root 30097 30096 0 Mar19 ? 00:00:00 /bin/run-parts --lsbsysinit /etc/update-motd.d
root 30129 30097 0 Mar19 ? 00:00:00 /bin/sh /etc/update-motd.d/50-landscape-sysinfo
root 30148 30129 0 Mar19 ? 00:00:00 /usr/bin/python /usr/bin/landscape-sysinfo
root 30451 30148 0 Mar19 ? 00:00:00 [who] <defunct>
为了解决这个问题,我基本上杀死了僵尸的每个父母who
,然后僵尸就消失了。
关于如何防止这种情况发生或在发生时妥善处理它,您有什么想法吗?
有什么方法可以禁用这些 motd 脚本有时? 比如,只有当 Jenkins 正在执行操作时git fetch
?实际上,如果我能以某种方式在 gitosis 用户尝试通过 SSH 连接时禁用 motd 脚本(例如,当发生任何 git 客户端/服务器交互时),那就太完美了。
也许有一种使用 Bash 的直接方法来终止任何运行超过一小时的 git 进程?呃。
我一般喜欢这些脚本提供的方便的 motd,所以我不想完全禁用它们。如果它们自己超时就好了。为什么每次登录时都要更新 motd?一天一次似乎就足够了。
我并不想切换到 gitolite 或其他 git 服务器,gitosis 在其他方面都运行良好。我不想切换到 SSH 以外的其他协议;gitosis 依赖于 SSH。由于 gitosis 在同一台服务器上运行,我应该能够使用file:///
语法引用 git 存储库。我现在就试一试。更新...不行,这行不通,因为它会绕过 gitolite,不允许 jenkins 将标签推回上游。我可以给 jenkins 更多 ACL,但我宁愿坚持使用 gitolite。
边注:这不会有帮助,因为问题似乎发生了后SSH 连接已建立。
答案1
如果我读得对的话,我喜欢认为我是......
那么您要求以一种非常迂回的方式update-motd
在 ubuntu 上禁用该功能。
查看/etc/cron.d
,/etc/cron.d/update-motd
如果找到了,则将其移至 /tmp。这应该可以阻止它。
我认为你不应该终止长时间运行的进程。但我认为禁用它不会带来任何危害update-motd
。
你可能想看看里面/etc/update-motd.d
/usr/sbin/update-motd 使用 run-parts 按字典顺序执行 /etc/update-motd.d 中的每个脚本,并将结果与每日消息头 /etc/motd.tail 连接起来。
通过这种方式,用户甚至其他软件包都可以将脚本放入 /etc/update-motd.d 中来影响 MOTD。(从https://wiki.ubuntu.com/UpdateMotd)
这是一篇博文来自和你一样讨厌 update-motd 的其他人 ;)