ssh_askpass 权限被拒绝,使用 GNU 并行时,即使使用 nohup 时也是如此

ssh_askpass 权限被拒绝,使用 GNU 并行时,即使使用 nohup 时也是如此

我正在尝试跨外部节点网络运行代码。我可以通过 访问“主”节点ssh,并且可以执行一个parallel脚本,将作业划分到 5 个可用节点的集群上。我有一个bash脚本,其中包含该parallel命令以及其他必要的组件。

我使用的最终命令看起来与此类似。

parallel -S node0,node1,node2,node3,node4 --ssh-delay 0.25 --delay 0.5 'run {1} {2}' ::: foo ::: bar

然而,我正在处理的集群因挂起相对频繁而闻名,例如,在大约 5 分钟的空闲时间后,我收到错误Broken pipe,并且ssh连接断开。这就是为什么我使用 执行上面的 bash 脚本(包含上面的parallel行)nohup,这应该保持 ssh 连接处于活动状态。

但由于我的实际代码需要相当多的计算时间,因此我收到与损坏的 ssh 连接相关的错误:

ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory^M
Permission denied, please try again.

即使从(例如node0node1)连接,boss 节点到其他节点也不需要密码。这会导致parallel抱怨没有更多可用的职位空缺,并发出无法登录的警告:

parallel: Warning: There are no job slots available. Increase --jobs.
parallel: Warning: Using only -1 connections to avoid race conditions.
parallel: Warning: ssh to node0 only allows for 0 simultaneous logins.
parallel: Warning: You may raise this by changing /etc/ssh/sshd_config: MaxStartups and MaxSessions on node0.
parallel: Warning: You can also try --sshdelay 0.1

我相信有一些挑剔的事情发生,过早地关闭了与集群内其他节点的 ssh 连接,可能是关闭与 boss 节点的连接的结果node0

我尝试使用ssh-agentssh-copy-id、 和sshpass按照 GNU 并行教程建立连接,并在 中设置MaxStartupsMaxSessions参数/etc/ssh/sshd_config,但无济于事。更重要的是,如果我减少代码的计算时间,那么并行命令将完美执行并按预期工作。

当执行的程序需要相当长的时间时,我可以做些什么来确保 ssh 连接不会中断,parallel或者还有其他事情发生吗?

答案1

为了保持连接有效,您可以经常使用ServerAliveInterval.可以在 中设置.ssh/config

答案2

我找到了错误的根源,即用于访问不同节点的 ssh-key 不正确。因此,问题既不在于 GNU 并行,也不在于 nohup。

让我首先更详细地说明设置,以理解问题。我首先从我的local计算机连接到一个“老板”节点,boss该节点连接到多个从节点slaves。通过在ssh连接到节点时启用 ssh 转发,进一步的 ssh 连接错误地使用了我计算机boss上的密钥。因此,当我断开和 之间local的连接时,无法访问正确的 ssh 密钥来建立与节点的连接。localbossbossslaves

通过使用生成新的公共 ssh 密钥ssh-keygen并将其添加到~/.ssh/authorized_keys.结果是,当 和 之间的连接local断开boss时,仍然可以使用自己的公钥boss与 建立 ssh 连接。slaves

由于 GNU 并行使用 ssh 建立连接,一旦密钥设置正确,权限(和其他相关)问题就消失了。nohup与设置一起使用ServerAliveInterval 60可解决/etc/ssh/ssh_config所有断开连接问题,并允许boss在进程保持运行时与节点断开连接。

相关内容