为什么需要几十秒才能获得shell提示?

这是一种经常发生的事情,在SSH服务器(甚至在我的Mac上打开一个terminal)之后,login横幅会立即打印,但是出现shell提示需要10秒到1分钟的时间。 之后,性能很好,networking延迟并不less见。

这似乎不是一个计算困难,内存密集型或IO型任务。 这些数十亿CPU周期在做什么?

这里可能会发生一些事情。 你可以在你的shell的手册中find大部分的答案,但是这些答案通常是非常长和斜的,所以…

有可能是你的问题归结为几件事情之一。

如果您的configuration文件或bashrc有昂贵的东西,请考虑将其修剪回去。

如果您的configuration文件或bashrc使用反向DNS查找(设置提示或其他),请修改DNS或使用主机名。

在初始化的同时,Shell还打开了大量的文件。 如果系统负载很高,它通常会出现在这里。

如果横幅是预先validation的,那么实际上也可能是慢的validation(pam,LDAP等)。

虽然这可能不是这些事情。 在显示提示之前,会发生令人惊讶的数量!

这可能是等待DNS或尝试通过LDAP或这样的身份validation。

尝试将UseDNS no添加到/ etc / ssh / sshd_config

如果它也在本地login上执行,请检查您configuration的LDAP服务器或DNS服务器是否缓慢或无响应。

一种可能性(被其他答案覆盖)是设置SSH会话本身的过程是丢失时间的地方。

另一种方法是在SSH会话build立之后在远程机器上运行的shell启动脚本有一些需要很长时间的事情(可能试图访问一些破坏的networking挂载)。 您可以debugging第二种可能性,如下所示:

暂时将以下内容添加到~/.bash_profile的顶部:

 set -x PS4='+ $(date "+%s.%N")\011 ' 

set -x为每个执行的shell命令打开一些debugging。 PS4variables控制着debugging的方式 – 特别是在这种情况下,我们使用date来添加时间戳。

然后,您可以分析debugging输出的时间戳,以查看启动脚本中的哪些命令耗时过长。

如果是Ubuntu服务器,默认的login设置会检查每次运行loginshell时是否有可更新的包。 如果软件包列表不在磁盘caching中,则即使在快速闲置的桌面上也可能需要一两秒钟的时间。

 $ ssh localhost Welcome to Ubuntu 15.04 (GNU/Linux 3.19.0-26-generic x86_64) * Documentation: https://help.ubuntu.com/ *** System restart required *** Last login: Sat Sep 12 01:38:38 2015 from localhost 

要生成“需要重新启动”消息,必须检查当前运行的内核是不是当前安装的默认内核。 (即有一个内核,我没有重新启动。)它也将打印一个安全更新可用的计数,如果有的话。

我认为这是最近引入的loginUbuntu的主要放缓。

如果没有,那么你的~/.bash_profile / ~/.bashrc可能是问题。

你有没有尝试从本身( ssh localhost )login到服务器? 还是马上login? (要查看caching的东西是否快得多。)

在大多数情况下是DNS请求的超时。

原因:服务器尝试使用客户端的IP地址进行反向DNS查找,并且没有得到答复。 如果A连接到B,则B尝试将A的IP地址转换为名称。

解决方法:将客户端的IP地址和名称input到服务器的主机文件中。

解决scheme:使所有主机知道DNS服务器。