背景,断电后偶尔导致重启后时间重置不正确,然后ntp工作居然不正常,不正常的原因是本地dns无法解析ntp域名,本地无法解析的原因是时间不一致导致的异常。
于是就写个脚本处理这个问题,主要正对两个方面:通过ip获取ntp的ip地址,开机自启同步。
脚本依赖:
- 223.5.5.5 阿里dns服务
- ntp.aliyun.com 阿里ntp服务
- jq json解析
opkg install jq
#!/usr/bin/env bash
function log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')]$*"
}
function log_exec() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')]$*"
exec "$@"
}
program_exists() {
local ret='0'
command -v "$1" >/dev/null 2>&1 || { local ret='1'; }
if [ "$ret" -ne 0 ]; then
return 1
fi
return 0
}
log "准备进行时间同步"
# 获取NTP服务器IP, 这里如果使用https会遇到证书可能还未生效的问题,无特殊需要使用http即可
ntp_ip=""
loop_num=0
while [ "$ntp_ip" == "" ]; do
loop_num=$((1 + 10#$loop_num))
if ! ntp_ip=$(curl -s --connect-timeout 5 "http://223.5.5.5/resolve?name=ntp.aliyun.com" | jq ".Answer[0].data"); then
ntp_ip=""
else
ntp_ip=${ntp_ip//"/}
fi
if [ "$ntp_ip" == "" ]; then
if [ $loop_num -ge 120 ]; then
log "无法获取到NTP服务器地址或网络不可用, 次数:${loop_num}, exit 1"
exit 1
fi
log "无法获取到NTP服务器地址或网络不可用, 准备重试, 次数:${loop_num}"
sleep 10s
else
break
fi
done
# 更新
if program_exists ntpclient; then
log_exec ntpclient -s -c 0 -h "${ntp_ip}"
exit 0
fi
if program_exists ntpdate; then
log_exec ntpdate "${ntp_ip}"
exit 0
fi
log "未找到可以执行时间更新的脚本,当前仅支持 ntpdate 和 ntpclient 两个程序"
exit 3
function log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')]$*"
}
function log_exec() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')]$*"
exec "$@"
}
program_exists() {
local ret='0'
command -v "$1" >/dev/null 2>&1 || { local ret='1'; }
if [ "$ret" -ne 0 ]; then
return 1
fi
return 0
}
log "准备进行时间同步"
# 获取NTP服务器IP, 这里如果使用https会遇到证书可能还未生效的问题,无特殊需要使用http即可
ntp_ip=""
loop_num=0
while [ "$ntp_ip" == "" ]; do
loop_num=$((1 + 10#$loop_num))
if ! ntp_ip=$(curl -s --connect-timeout 5 "http://223.5.5.5/resolve?name=ntp.aliyun.com" | jq ".Answer[0].data"); then
ntp_ip=""
else
ntp_ip=${ntp_ip//"/}
fi
if [ "$ntp_ip" == "" ]; then
if [ $loop_num -ge 120 ]; then
log "无法获取到NTP服务器地址或网络不可用, 次数:${loop_num}, exit 1"
exit 1
fi
log "无法获取到NTP服务器地址或网络不可用, 准备重试, 次数:${loop_num}"
sleep 10s
else
break
fi
done
# 更新
if program_exists ntpclient; then
log_exec ntpclient -s -c 0 -h "${ntp_ip}"
exit 0
fi
if program_exists ntpdate; then
log_exec ntpdate "${ntp_ip}"
exit 0
fi
log "未找到可以执行时间更新的脚本,当前仅支持 ntpdate 和 ntpclient 两个程序"
exit 3
当前还没有任何评论