如何解决“SSH 连接被远程端意外关闭”的问题?

ken*_*orb 6 linux ssh amazon-web-services jenkins vagrant

我的配置:

  • 仅用于 Jenkins (2.7.1) 的专用服务器 (Ubuntu 16.04 LTS),
  • 超过 100 个 Jenkins 作业,每个作业都调用 AWS 的 vagrant 实例 ( Vagrantfile ),
  • 每个作业(配置脚本)可能需要 1-2 小时才能运行,
  • 大多数服务器配置文件(例如 SSH)都有默认的系统配置。

当我同时运行多个 Jenkins 实例时,它们更有可能因以下错误而失败:

00:00:00.774 + vagrant up --no-provision --destroy-on-error --provider=aws
00:00:09.635 Bringing machine 'MT-aws' up with 'aws' provider...
...
00:01:16.498     MT-aws: Running: inline script
...
00:01:26.415 ==> MT-aws: + echo
00:01:26.415 ==> MT-aws: + sleep 20
00:01:26.427 The SSH connection was unexpectedly closed by the remote end. This
00:01:26.427 usually indicates that SSH within the guest machine was unable to
00:01:26.427 properly start up. Please boot the VM in GUI mode to check whether
00:01:26.427 it is booting properly.
00:01:26.625 Build step 'Execute shell' marked build as failure
Run Code Online (Sandbox Code Playgroud)

事实:

  • 配置脚本在随机位置失败(失败之前没有特定代码),
  • 服务器没有超载,并且有足够的可用 RAM 和对 Gbit 网络的访问,
  • 我并行运行的作业越多,失败的机会就越大,
  • 单独重新运行相同的作业通常效果很好,
  • 中的默认设置/etc/ssh/ssh_config~/.ssh/configJenkins 没有。

如何解决上述 SSH 意外关闭的问题?

我是否需要增加一些 SSH 超时设置或其他设置?

err*_*07s 5

打开你的/etc/ssh/sshd_config文件:

\n\n
# vi /etc/ssh/sshd_config\n
Run Code Online (Sandbox Code Playgroud)\n\n

修改设置如下:

\n\n
ClientAliveInterval 30\nClientAliveCountMax 5\n
Run Code Online (Sandbox Code Playgroud)\n\n

在哪里,

\n\n
\n

ClientAliveInterval:设置超时间隔(以秒为单位 (30)),在此之后如果没有从客户端接收到数据,sshd 将通过加密通道发送消息以请求客户端响应。默认值为 0,表示这些消息不会发送到客户端。此选项仅适用于协议版本 2。

\n\n

ClientAliveCountMax:设置在 sshd 没有从客户端接收到任何消息的情况下可以发送的客户端活动消息的数量 (5)。如果在发送客户端活动消息时达到此阈值,sshd 将断开客户端连接,终止会话。

\n
\n\n

关闭并保存文件,然后重新启动sshd,例如:

\n\n
# /etc/init.d/ssh restart\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者:

\n\n
# service sshd restart\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

ServerAliveInterval另一个选项是在 client\xe2\x80\x99s(您的工作站)中启用ssh_config,例如

\n\n
# vi /etc/ssh/ssh_config\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后按如下方式附加/修改值:

\n\n
ServerAliveInterval 30\nServerAliveCountMax 5\n
Run Code Online (Sandbox Code Playgroud)\n\n

在哪里,

\n\n
\n

ServerAliveInterval:设置超时间隔(以秒为单位),在此之后如果没有从服务器收到数据,ssh 将通过加密通道发送消息以请求服务器响应。

\n
\n\n

在上面的示例中,ServerAliveInterval设置为 15 并ServerAliveCountMax保留为 3,如果服务器无响应,ssh 将在大约 45 秒后断开连接。同样,此选项仅适用于协议版本 2。

\n