shell 脚本 - 当 ping 失败时循环停止
shell script - loop stops when ping fails
我正在尝试编写一个 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 机器上 运行)
这可能是因为 ssh
与 while read
循环共享标准输入,并耗尽所有数据以将其发送到远程主机。
使用 ssh -n
来防止这种情况:
ssh -n ${hostid} uptime > ${WORKDIR}/${hostid} &
我正在尝试编写一个 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 机器上 运行)
这可能是因为 ssh
与 while read
循环共享标准输入,并耗尽所有数据以将其发送到远程主机。
使用 ssh -n
来防止这种情况:
ssh -n ${hostid} uptime > ${WORKDIR}/${hostid} &