linux - shell 脚本 - 当 ping 失败时循环停止

标签 linux shell timeout ping centos5

我正在尝试编写一个 shell 脚本来 ping 指定文件中列出的每个服务器并获取其正常运行时间。预期的行为是,如果在 ${TIMEOUT} 秒后未到达服务器,脚本将停止尝试 ping 该服务器并移至列表中的下一个服务器。但是,当对服务器的 ping 超时时,程序将完全停止,而不是继续移动到列表中的下一个服务器。我该如何解决这个问题?

这是相关的代码片段(${ALS_HOSTS} 是要 ping 的服务器列表):

while read hostid
do
        ping -c ${NUM_PING_PACKETS} ${hostid}
        if ping -w ${TIMEOUT} -c ${NUM_PING_PACKETS} ${hostid} | grep ' from' 2>/dev/null 1>&2 # check for output
        then
                ssh ${hostid} uptime > ${WORKDIR}/${hostid} &
        fi
done  < ${ALS_HOSTS}

(此脚本将在目前无法升级或重新配置的 CentOS 5 机器上运行)

最佳答案

这可能是因为 sshwhile read 循环共享标准输入,并耗尽所有数据以将其发送到远程主机。

使用 ssh -n 来防止这种情况:

ssh -n ${hostid} uptime > ${WORKDIR}/${hostid} &

关于linux - shell 脚本 - 当 ping 失败时循环停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45063505/

相关文章:

msgget 可以是恶意的吗?

python-3.x - 如何对 django 项目进行 cythonize?

java - 写入 stdout,也像真正的终端一样打印提供的输入

java - JPA(和/或 Hibernate)- 如何设置连接和/或查询的超时阈值?

time - 为什么这个 Golang 代码不能在多个时间之间进行选择。 channel 工作后?

Perl CGI 工具中的 Apache 超时

linux - zsh 参数扩展语法 : combining default value and conversion to upper case

linux - ssh-keygen:当提示“输入用于保存 key 的文件(/home/***/.ssh/id_rsa):”时,我不小心输入了“y”:

bash - docker alpine/bin/sh script.sh 未找到

linux - GRUB 的第 1 阶段引导加载程序如何加载第 2 阶段引导加载程序?