通过 ssh 重启网络导致挂起

通过 ssh 重启网络导致挂起

我正在运行这个:

ssh [email protected] '/etc/init.d/networking restart'

它能工作并输出结果,但从不返回。但其他命令却能返回。可能是因为网络断线了(如预期的那样)。我该如何终止它?我尝试添加退出命令,但没有成功。

更新:我注意到这有时确实有效。如果进程中断并且远程接口配置处于未知状态,则似乎会发生问题。我仍然无法确切地找出导致挂起的原因。

答案1

也许重启命令在连接丢失时被中断(乍一看是要求系统重新启动其网络连接通过网络似乎很危险)。您想要的是networking restart独立于控制终端运行。我会添加一个 crontab 条目,如下所示(也许将其放入/etc/cron.d/checker-thingy):

* * * * * root /path/to/checker-thingy.sh

那么 checker-thingy.sh 将会是这样的:

[ -f /tmp/restart-network ] && service networking restart
[ -f /tmp/restart-network ] && rm /tmp/restart-network

这有点糟糕,而且容易引发其他问题,但基本上正如您所看到的,如果它找到特定的标志文件,它将重新启动网络/tmp(然后删除该文件以避免网络重置循环)。

然后您可以在自动脚本中执行以下操作:

ssh server-ip 'touch /tmp/restart-network'

大约一分钟后,您应该会看到网络接口按要求循环。

答案2

我偶然发现了这个非常有趣的页面:http://mywiki.wooledge.org/BashFAQ/063。该ssh命令正在等待远程进程的输出流关闭,因此它将被网络关闭捕获。

因此(已测试):

ssh user@host "sleep 60 &" 

将在 60 秒后返回,而

ssh user@host  "sleep 60 >/dev/null 2>&1 &" 

在后台启动命令后将立即返回sleep

如果这是正确的,解决方案就是立即从远程 shell 中分离标准输出和错误 --- 像这样(未经测试,请检查):

ssh user@host '/etc/init.d/networking restart >/dev/null 2>&1 &' 

或者如果这仍然触发网络故障和 shell 关闭之间的竞争,

ssh user@host '(sleep 10 && /etc/init.d/networking restart ) >/dev/null 2>&1 &'

应该管用。

答案3

通过键入以下命令删除 shh 包

  • sudo apt-get 删除 ssh

并通过以下方式重新安装:

  • sudo apt-get 安装 ssh。

相关内容