我正在运行这个:
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。