我正在远程主机上执行通过无密码SSH连接的脚本。我想设置一个超时,这样如果远程主机花了无限的时间来运行,我想退出那个ssh会话并继续我的sh脚本中的其他行。
关于如何做的任何想法?
答案 0 :(得分:239)
ssh -o ConnectTimeout=10 <hostName>
其中10是以秒为单位的时间。
答案 1 :(得分:98)
使用-o ConnectTimeout
和-o BatchMode=yes -o StrictHostKeyChecking=no
。
ConnectTimeout 可防止脚本挂起, BatchMode 可防止主机未知,YES添加到known_hosts, StrictHostKeyChecking 添加指纹自动。
****注**** “StrictHostKeyChecking”仅适用于您信任主机的内部网络。根据SSH客户端的版本,“您确定要添加指纹”会导致客户端无限期挂起(主要是在AIX上运行的旧版本)。大多数现代版本都没有遇到这个问题。如果你必须处理多个主机的指纹,我建议使用某种配置管理工具维护known_hosts文件,如puppet / ansible / chef / salt /等。
答案 2 :(得分:40)
试试这个:
timeout 5 ssh user@ip
timeout执行ssh命令(带args),如果ssh在5秒后没有返回,则发送SIGTERM。 有关超时的更多详细信息,请阅读本文档: http://man7.org/linux/man-pages/man1/timeout.1.html
或者您可以使用ssh:
的参数ssh -o ConnectTimeout=3 user@ip
答案 3 :(得分:14)
你也可以用旗帜连接
-o ServerAliveInterval=<secs>所以SSH客户端每隔
<secs>
秒就会向服务器发送一个空包,只是为了保持连接活着。
在Linux中,也可以/etc/ssh/ssh_config
中的~/.ssh/config
或{{1}}中的每个用户进行全局设置。
答案 4 :(得分:0)
好吧,你可以使用nohup来运行你在'非阻塞模式'上运行的任何东西。所以你可以继续检查是否应该运行,运行,否则退出。
nohup ./my-script-that-may-take-long-to-finish.sh & ./check-if-previous-script-ran-or-exit.sh
echo "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txt
所以在第二个中你只是检查文件是否存在。
答案 5 :(得分:0)
如果其他所有方法均失败(包括没有使用AvroConsumer
命令),则此shell脚本中的概念将起作用:
timeout