在某些虚拟机上,看起来每个 ssh 会话在退出时都会作为孤立进程结束。我可以通过 ssh 登录到机器上,然后执行 exit 或 ^D,然后使用 ps -elf | 来重现它。grep defunct 我还有一个 ssh 进程。我们的监控使用 ssh 很多,所以早上有成百上千的孤儿僵尸,大约有 20 台虚拟机..
这是 ps 输出的示例:
5 Z user 3197 1 0 80 0 - 0 exit 10:00 ? 00:00:00 [sshd] <defunct>
我尝试对父级(sshd)进行 strace 以查看,这是我退出 ssh 会话时的输出:
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24025, si_status=255, si_utime=0, si_stime=2} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 255}], WNOHANG, NULL) = 24025
wait4(-1, 0x7ffc0d57901c, WNOHANG, NULL) = 0
rt_sigaction(SIGCHLD, NULL, {0x7f164fee7d70, [], SA_RESTORER, 0x7f164db34d40}, 8) = 0
rt_sigreturn() = -1 EINTR (Interrupted system call)
select(7, [3 4], NULL, NULL, NULL
并不是说我真的知道我在那里寻找什么,但我不知道可能是什么问题。有任何想法吗 ?我还看到了很多 nrpe 已失效的进程,但由于某种原因,重新启动 sshd 会清除 ssh 和 nrpe 僵尸。
不知道这是否相关,但这些机器上的 I/O 非常非常慢,几百兆字节的简单 dd 有时需要数百秒才能完成。
编辑:如被问及,openssh 6.6p1-2ubuntu2.7 的 ubuntu 值得信赖
因此,在 sshd_config 中禁用 UsePrivilegeSeparation 似乎可以解决问题。不是真的很喜欢这样做,但它确实有效..