chrony-tool-v2.sh
· 4.9 KiB · Bash
Brut
#!/usr/bin/env bash
# ============================
# Chrony 运维诊断工具 v2
# ============================
SERVICE="chronyd"
CONF="/etc/chrony.conf"
if systemctl list-unit-files | grep -q chrony.service; then
SERVICE="chrony"
fi
pause(){
echo
read -p "按回车返回菜单..."
}
header(){
clear
echo "======================================"
echo " Chrony 运维诊断工具 v2"
echo "======================================"
echo
}
# ----------------------------
# 基础信息
# ----------------------------
show_time(){
header
echo "系统时间"
echo "--------------------------------"
date
echo
timedatectl
pause
}
service_status(){
header
echo "Chrony 服务状态"
echo "--------------------------------"
systemctl status $SERVICE --no-pager
pause
}
# ----------------------------
# NTP信息
# ----------------------------
show_sources(){
header
echo "NTP Sources"
echo "--------------------------------"
chronyc sources -v
pause
}
show_tracking(){
header
echo "Chrony Tracking"
echo "--------------------------------"
chronyc tracking
pause
}
show_activity(){
header
echo "Chrony Activity"
echo "--------------------------------"
chronyc activity
pause
}
# ----------------------------
# 强制同步
# ----------------------------
force_sync(){
header
echo "尝试强制同步时间..."
echo
chronyc -a makestep
echo
echo "同步命令已执行"
pause
}
# ----------------------------
# 重启
# ----------------------------
restart_service(){
header
echo "重启 Chrony..."
echo
systemctl restart $SERVICE
echo "完成"
pause
}
# ----------------------------
# 修改NTP服务器
# ----------------------------
change_ntp(){
header
echo "当前 NTP server"
grep ^server $CONF
echo
read -p "输入新的 NTP 服务器: " NTP
if [ -z "$NTP" ]; then
echo "未输入"
pause
return
fi
cp $CONF ${CONF}.bak.$(date +%s)
sed -i '/^server/d' $CONF
echo "server $NTP iburst" >> $CONF
systemctl restart $SERVICE
echo
echo "已修改并重启 Chrony"
pause
}
# ----------------------------
# 推荐NTP
# ----------------------------
recommend_ntp(){
header
echo "推荐 NTP 服务器 (中国常用)"
echo "--------------------------------"
cat <<EOF
阿里云
ntp.aliyun.com
腾讯云
time1.cloud.tencent.com
time2.cloud.tencent.com
国家授时中心
ntp.ntsc.ac.cn
中国教育网
cn.ntp.org.cn
公网 pool
0.cn.pool.ntp.org
1.cn.pool.ntp.org
EOF
pause
}
# ----------------------------
# 健康检查
# ----------------------------
health_check(){
header
echo "Chrony 健康诊断报告"
echo "--------------------------------"
SERVICE_STATUS=$(systemctl is-active $SERVICE)
if [ "$SERVICE_STATUS" = "active" ]; then
echo "Chrony Service: OK"
else
echo "Chrony Service: ERROR"
fi
echo
SYNC=$(timedatectl | grep "System clock synchronized" | awk '{print $4}')
echo "System Clock Sync: $SYNC"
echo
TRACK=$(chronyc tracking)
OFFSET=$(echo "$TRACK" | grep "Last offset" | awk '{print $3}')
LEAP=$(echo "$TRACK" | grep "Leap status" | cut -d ':' -f2)
echo "Last Offset: $OFFSET"
echo "Leap Status: $LEAP"
echo
echo "Sources 状态"
echo "--------------------------------"
chronyc sources
echo
# offset判断
OFFSET_NUM=$(echo $OFFSET | tr -d 's')
if [[ $(echo "$OFFSET_NUM > 0.5" | bc 2>/dev/null) -eq 1 ]]; then
echo "警告: 偏差超过0.5秒"
fi
echo
echo "诊断建议"
echo "--------------------------------"
if [ "$SERVICE_STATUS" != "active" ]; then
echo "建议: 启动 chrony 服务"
fi
if [ "$SYNC" != "yes" ]; then
echo "建议: 检查 NTP 源或网络"
fi
echo
pause
}
# ----------------------------
# 完整报告
# ----------------------------
full_report(){
header
echo "Chrony 完整诊断报告"
echo "================================"
echo
echo "系统时间"
echo "--------------------------------"
date
echo
echo "timedatectl"
echo "--------------------------------"
timedatectl
echo
echo "tracking"
echo "--------------------------------"
chronyc tracking
echo
echo "sources"
echo "--------------------------------"
chronyc sources -v
echo
echo "activity"
echo "--------------------------------"
chronyc activity
echo
pause
}
# ----------------------------
# 主菜单
# ----------------------------
menu(){
while true
do
header
echo "1 查看系统时间"
echo "2 查看 Chrony 服务状态"
echo "3 查看 Sources"
echo "4 查看 Tracking"
echo "5 查看 Activity"
echo "6 强制同步时间"
echo "7 修改 NTP 服务器"
echo "8 重启 Chrony"
echo "9 推荐 NTP 服务器"
echo "10 Chrony 健康检查"
echo "11 完整诊断报告"
echo
echo "0 退出"
echo
read -p "选择操作: " CHOICE
case $CHOICE in
1) show_time ;;
2) service_status ;;
3) show_sources ;;
4) show_tracking ;;
5) show_activity ;;
6) force_sync ;;
7) change_ntp ;;
8) restart_service ;;
9) recommend_ntp ;;
10) health_check ;;
11) full_report ;;
0) exit ;;
*) echo "无效选项"; sleep 1 ;;
esac
done
}
menu
| 1 | #!/usr/bin/env bash |
| 2 | |
| 3 | # ============================ |
| 4 | # Chrony 运维诊断工具 v2 |
| 5 | # ============================ |
| 6 | |
| 7 | SERVICE="chronyd" |
| 8 | CONF="/etc/chrony.conf" |
| 9 | |
| 10 | if systemctl list-unit-files | grep -q chrony.service; then |
| 11 | SERVICE="chrony" |
| 12 | fi |
| 13 | |
| 14 | pause(){ |
| 15 | echo |
| 16 | read -p "按回车返回菜单..." |
| 17 | } |
| 18 | |
| 19 | header(){ |
| 20 | clear |
| 21 | echo "======================================" |
| 22 | echo " Chrony 运维诊断工具 v2" |
| 23 | echo "======================================" |
| 24 | echo |
| 25 | } |
| 26 | |
| 27 | # ---------------------------- |
| 28 | # 基础信息 |
| 29 | # ---------------------------- |
| 30 | |
| 31 | show_time(){ |
| 32 | header |
| 33 | echo "系统时间" |
| 34 | echo "--------------------------------" |
| 35 | date |
| 36 | echo |
| 37 | timedatectl |
| 38 | pause |
| 39 | } |
| 40 | |
| 41 | service_status(){ |
| 42 | header |
| 43 | echo "Chrony 服务状态" |
| 44 | echo "--------------------------------" |
| 45 | systemctl status $SERVICE --no-pager |
| 46 | pause |
| 47 | } |
| 48 | |
| 49 | # ---------------------------- |
| 50 | # NTP信息 |
| 51 | # ---------------------------- |
| 52 | |
| 53 | show_sources(){ |
| 54 | header |
| 55 | echo "NTP Sources" |
| 56 | echo "--------------------------------" |
| 57 | chronyc sources -v |
| 58 | pause |
| 59 | } |
| 60 | |
| 61 | show_tracking(){ |
| 62 | header |
| 63 | echo "Chrony Tracking" |
| 64 | echo "--------------------------------" |
| 65 | chronyc tracking |
| 66 | pause |
| 67 | } |
| 68 | |
| 69 | show_activity(){ |
| 70 | header |
| 71 | echo "Chrony Activity" |
| 72 | echo "--------------------------------" |
| 73 | chronyc activity |
| 74 | pause |
| 75 | } |
| 76 | |
| 77 | # ---------------------------- |
| 78 | # 强制同步 |
| 79 | # ---------------------------- |
| 80 | |
| 81 | force_sync(){ |
| 82 | header |
| 83 | echo "尝试强制同步时间..." |
| 84 | echo |
| 85 | |
| 86 | chronyc -a makestep |
| 87 | |
| 88 | echo |
| 89 | echo "同步命令已执行" |
| 90 | pause |
| 91 | } |
| 92 | |
| 93 | # ---------------------------- |
| 94 | # 重启 |
| 95 | # ---------------------------- |
| 96 | |
| 97 | restart_service(){ |
| 98 | header |
| 99 | echo "重启 Chrony..." |
| 100 | echo |
| 101 | |
| 102 | systemctl restart $SERVICE |
| 103 | |
| 104 | echo "完成" |
| 105 | pause |
| 106 | } |
| 107 | |
| 108 | # ---------------------------- |
| 109 | # 修改NTP服务器 |
| 110 | # ---------------------------- |
| 111 | |
| 112 | change_ntp(){ |
| 113 | header |
| 114 | |
| 115 | echo "当前 NTP server" |
| 116 | grep ^server $CONF |
| 117 | echo |
| 118 | |
| 119 | read -p "输入新的 NTP 服务器: " NTP |
| 120 | |
| 121 | if [ -z "$NTP" ]; then |
| 122 | echo "未输入" |
| 123 | pause |
| 124 | return |
| 125 | fi |
| 126 | |
| 127 | cp $CONF ${CONF}.bak.$(date +%s) |
| 128 | |
| 129 | sed -i '/^server/d' $CONF |
| 130 | echo "server $NTP iburst" >> $CONF |
| 131 | |
| 132 | systemctl restart $SERVICE |
| 133 | |
| 134 | echo |
| 135 | echo "已修改并重启 Chrony" |
| 136 | pause |
| 137 | } |
| 138 | |
| 139 | # ---------------------------- |
| 140 | # 推荐NTP |
| 141 | # ---------------------------- |
| 142 | |
| 143 | recommend_ntp(){ |
| 144 | |
| 145 | header |
| 146 | |
| 147 | echo "推荐 NTP 服务器 (中国常用)" |
| 148 | echo "--------------------------------" |
| 149 | |
| 150 | cat <<EOF |
| 151 | |
| 152 | 阿里云 |
| 153 | ntp.aliyun.com |
| 154 | |
| 155 | 腾讯云 |
| 156 | time1.cloud.tencent.com |
| 157 | time2.cloud.tencent.com |
| 158 | |
| 159 | 国家授时中心 |
| 160 | ntp.ntsc.ac.cn |
| 161 | |
| 162 | 中国教育网 |
| 163 | cn.ntp.org.cn |
| 164 | |
| 165 | 公网 pool |
| 166 | 0.cn.pool.ntp.org |
| 167 | 1.cn.pool.ntp.org |
| 168 | |
| 169 | EOF |
| 170 | |
| 171 | pause |
| 172 | } |
| 173 | |
| 174 | # ---------------------------- |
| 175 | # 健康检查 |
| 176 | # ---------------------------- |
| 177 | |
| 178 | health_check(){ |
| 179 | |
| 180 | header |
| 181 | |
| 182 | echo "Chrony 健康诊断报告" |
| 183 | echo "--------------------------------" |
| 184 | |
| 185 | SERVICE_STATUS=$(systemctl is-active $SERVICE) |
| 186 | |
| 187 | if [ "$SERVICE_STATUS" = "active" ]; then |
| 188 | echo "Chrony Service: OK" |
| 189 | else |
| 190 | echo "Chrony Service: ERROR" |
| 191 | fi |
| 192 | |
| 193 | echo |
| 194 | |
| 195 | SYNC=$(timedatectl | grep "System clock synchronized" | awk '{print $4}') |
| 196 | |
| 197 | echo "System Clock Sync: $SYNC" |
| 198 | |
| 199 | echo |
| 200 | |
| 201 | TRACK=$(chronyc tracking) |
| 202 | |
| 203 | OFFSET=$(echo "$TRACK" | grep "Last offset" | awk '{print $3}') |
| 204 | LEAP=$(echo "$TRACK" | grep "Leap status" | cut -d ':' -f2) |
| 205 | |
| 206 | echo "Last Offset: $OFFSET" |
| 207 | echo "Leap Status: $LEAP" |
| 208 | |
| 209 | echo |
| 210 | |
| 211 | echo "Sources 状态" |
| 212 | echo "--------------------------------" |
| 213 | |
| 214 | chronyc sources |
| 215 | |
| 216 | echo |
| 217 | |
| 218 | # offset判断 |
| 219 | OFFSET_NUM=$(echo $OFFSET | tr -d 's') |
| 220 | |
| 221 | if [[ $(echo "$OFFSET_NUM > 0.5" | bc 2>/dev/null) -eq 1 ]]; then |
| 222 | echo "警告: 偏差超过0.5秒" |
| 223 | fi |
| 224 | |
| 225 | echo |
| 226 | echo "诊断建议" |
| 227 | echo "--------------------------------" |
| 228 | |
| 229 | if [ "$SERVICE_STATUS" != "active" ]; then |
| 230 | echo "建议: 启动 chrony 服务" |
| 231 | fi |
| 232 | |
| 233 | if [ "$SYNC" != "yes" ]; then |
| 234 | echo "建议: 检查 NTP 源或网络" |
| 235 | fi |
| 236 | |
| 237 | echo |
| 238 | pause |
| 239 | } |
| 240 | |
| 241 | # ---------------------------- |
| 242 | # 完整报告 |
| 243 | # ---------------------------- |
| 244 | |
| 245 | full_report(){ |
| 246 | |
| 247 | header |
| 248 | |
| 249 | echo "Chrony 完整诊断报告" |
| 250 | echo "================================" |
| 251 | echo |
| 252 | |
| 253 | echo "系统时间" |
| 254 | echo "--------------------------------" |
| 255 | date |
| 256 | echo |
| 257 | |
| 258 | echo "timedatectl" |
| 259 | echo "--------------------------------" |
| 260 | timedatectl |
| 261 | echo |
| 262 | |
| 263 | echo "tracking" |
| 264 | echo "--------------------------------" |
| 265 | chronyc tracking |
| 266 | echo |
| 267 | |
| 268 | echo "sources" |
| 269 | echo "--------------------------------" |
| 270 | chronyc sources -v |
| 271 | echo |
| 272 | |
| 273 | echo "activity" |
| 274 | echo "--------------------------------" |
| 275 | chronyc activity |
| 276 | echo |
| 277 | |
| 278 | pause |
| 279 | } |
| 280 | |
| 281 | # ---------------------------- |
| 282 | # 主菜单 |
| 283 | # ---------------------------- |
| 284 | |
| 285 | menu(){ |
| 286 | |
| 287 | while true |
| 288 | do |
| 289 | |
| 290 | header |
| 291 | |
| 292 | echo "1 查看系统时间" |
| 293 | echo "2 查看 Chrony 服务状态" |
| 294 | echo "3 查看 Sources" |
| 295 | echo "4 查看 Tracking" |
| 296 | echo "5 查看 Activity" |
| 297 | echo "6 强制同步时间" |
| 298 | echo "7 修改 NTP 服务器" |
| 299 | echo "8 重启 Chrony" |
| 300 | echo "9 推荐 NTP 服务器" |
| 301 | echo "10 Chrony 健康检查" |
| 302 | echo "11 完整诊断报告" |
| 303 | echo |
| 304 | echo "0 退出" |
| 305 | echo |
| 306 | |
| 307 | read -p "选择操作: " CHOICE |
| 308 | |
| 309 | case $CHOICE in |
| 310 | |
| 311 | 1) show_time ;; |
| 312 | 2) service_status ;; |
| 313 | 3) show_sources ;; |
| 314 | 4) show_tracking ;; |
| 315 | 5) show_activity ;; |
| 316 | 6) force_sync ;; |
| 317 | 7) change_ntp ;; |
| 318 | 8) restart_service ;; |
| 319 | 9) recommend_ntp ;; |
| 320 | 10) health_check ;; |
| 321 | 11) full_report ;; |
| 322 | 0) exit ;; |
| 323 | *) echo "无效选项"; sleep 1 ;; |
| 324 | |
| 325 | esac |
| 326 | |
| 327 | done |
| 328 | |
| 329 | } |
| 330 | |
| 331 | menu |
chrony-tool.sh
· 4.9 KiB · Bash
Brut
#!/usr/bin/env bash
# ============================
# Chrony 运维诊断工具 v2
# ============================
SERVICE="chronyd"
CONF="/etc/chrony.conf"
if systemctl list-unit-files | grep -q chrony.service; then
SERVICE="chrony"
fi
pause(){
echo
read -p "按回车返回菜单..."
}
header(){
clear
echo "======================================"
echo " Chrony 运维诊断工具 v2"
echo "======================================"
echo
}
# ----------------------------
# 基础信息
# ----------------------------
show_time(){
header
echo "系统时间"
echo "--------------------------------"
date
echo
timedatectl
pause
}
service_status(){
header
echo "Chrony 服务状态"
echo "--------------------------------"
systemctl status $SERVICE --no-pager
pause
}
# ----------------------------
# NTP信息
# ----------------------------
show_sources(){
header
echo "NTP Sources"
echo "--------------------------------"
chronyc sources -v
pause
}
show_tracking(){
header
echo "Chrony Tracking"
echo "--------------------------------"
chronyc tracking
pause
}
show_activity(){
header
echo "Chrony Activity"
echo "--------------------------------"
chronyc activity
pause
}
# ----------------------------
# 强制同步
# ----------------------------
force_sync(){
header
echo "尝试强制同步时间..."
echo
chronyc -a makestep
echo
echo "同步命令已执行"
pause
}
# ----------------------------
# 重启
# ----------------------------
restart_service(){
header
echo "重启 Chrony..."
echo
systemctl restart $SERVICE
echo "完成"
pause
}
# ----------------------------
# 修改NTP服务器
# ----------------------------
change_ntp(){
header
echo "当前 NTP server"
grep ^server $CONF
echo
read -p "输入新的 NTP 服务器: " NTP
if [ -z "$NTP" ]; then
echo "未输入"
pause
return
fi
cp $CONF ${CONF}.bak.$(date +%s)
sed -i '/^server/d' $CONF
echo "server $NTP iburst" >> $CONF
systemctl restart $SERVICE
echo
echo "已修改并重启 Chrony"
pause
}
# ----------------------------
# 推荐NTP
# ----------------------------
recommend_ntp(){
header
echo "推荐 NTP 服务器 (中国常用)"
echo "--------------------------------"
cat <<EOF
阿里云
ntp.aliyun.com
腾讯云
time1.cloud.tencent.com
time2.cloud.tencent.com
国家授时中心
ntp.ntsc.ac.cn
中国教育网
cn.ntp.org.cn
公网 pool
0.cn.pool.ntp.org
1.cn.pool.ntp.org
EOF
pause
}
# ----------------------------
# 健康检查
# ----------------------------
health_check(){
header
echo "Chrony 健康诊断报告"
echo "--------------------------------"
SERVICE_STATUS=$(systemctl is-active $SERVICE)
if [ "$SERVICE_STATUS" = "active" ]; then
echo "Chrony Service: OK"
else
echo "Chrony Service: ERROR"
fi
echo
SYNC=$(timedatectl | grep "System clock synchronized" | awk '{print $4}')
echo "System Clock Sync: $SYNC"
echo
TRACK=$(chronyc tracking)
OFFSET=$(echo "$TRACK" | grep "Last offset" | awk '{print $3}')
LEAP=$(echo "$TRACK" | grep "Leap status" | cut -d ':' -f2)
echo "Last Offset: $OFFSET"
echo "Leap Status: $LEAP"
echo
echo "Sources 状态"
echo "--------------------------------"
chronyc sources
echo
# offset判断
OFFSET_NUM=$(echo $OFFSET | tr -d 's')
if [[ $(echo "$OFFSET_NUM > 0.5" | bc 2>/dev/null) -eq 1 ]]; then
echo "警告: 偏差超过0.5秒"
fi
echo
echo "诊断建议"
echo "--------------------------------"
if [ "$SERVICE_STATUS" != "active" ]; then
echo "建议: 启动 chrony 服务"
fi
if [ "$SYNC" != "yes" ]; then
echo "建议: 检查 NTP 源或网络"
fi
echo
pause
}
# ----------------------------
# 完整报告
# ----------------------------
full_report(){
header
echo "Chrony 完整诊断报告"
echo "================================"
echo
echo "系统时间"
echo "--------------------------------"
date
echo
echo "timedatectl"
echo "--------------------------------"
timedatectl
echo
echo "tracking"
echo "--------------------------------"
chronyc tracking
echo
echo "sources"
echo "--------------------------------"
chronyc sources -v
echo
echo "activity"
echo "--------------------------------"
chronyc activity
echo
pause
}
# ----------------------------
# 主菜单
# ----------------------------
menu(){
while true
do
header
echo "1 查看系统时间"
echo "2 查看 Chrony 服务状态"
echo "3 查看 Sources"
echo "4 查看 Tracking"
echo "5 查看 Activity"
echo "6 强制同步时间"
echo "7 修改 NTP 服务器"
echo "8 重启 Chrony"
echo "9 推荐 NTP 服务器"
echo "10 Chrony 健康检查"
echo "11 完整诊断报告"
echo
echo "0 退出"
echo
read -p "选择操作: " CHOICE
case $CHOICE in
1) show_time ;;
2) service_status ;;
3) show_sources ;;
4) show_tracking ;;
5) show_activity ;;
6) force_sync ;;
7) change_ntp ;;
8) restart_service ;;
9) recommend_ntp ;;
10) health_check ;;
11) full_report ;;
0) exit ;;
*) echo "无效选项"; sleep 1 ;;
esac
done
}
menu
| 1 | #!/usr/bin/env bash |
| 2 | |
| 3 | # ============================ |
| 4 | # Chrony 运维诊断工具 v2 |
| 5 | # ============================ |
| 6 | |
| 7 | SERVICE="chronyd" |
| 8 | CONF="/etc/chrony.conf" |
| 9 | |
| 10 | if systemctl list-unit-files | grep -q chrony.service; then |
| 11 | SERVICE="chrony" |
| 12 | fi |
| 13 | |
| 14 | pause(){ |
| 15 | echo |
| 16 | read -p "按回车返回菜单..." |
| 17 | } |
| 18 | |
| 19 | header(){ |
| 20 | clear |
| 21 | echo "======================================" |
| 22 | echo " Chrony 运维诊断工具 v2" |
| 23 | echo "======================================" |
| 24 | echo |
| 25 | } |
| 26 | |
| 27 | # ---------------------------- |
| 28 | # 基础信息 |
| 29 | # ---------------------------- |
| 30 | |
| 31 | show_time(){ |
| 32 | header |
| 33 | echo "系统时间" |
| 34 | echo "--------------------------------" |
| 35 | date |
| 36 | echo |
| 37 | timedatectl |
| 38 | pause |
| 39 | } |
| 40 | |
| 41 | service_status(){ |
| 42 | header |
| 43 | echo "Chrony 服务状态" |
| 44 | echo "--------------------------------" |
| 45 | systemctl status $SERVICE --no-pager |
| 46 | pause |
| 47 | } |
| 48 | |
| 49 | # ---------------------------- |
| 50 | # NTP信息 |
| 51 | # ---------------------------- |
| 52 | |
| 53 | show_sources(){ |
| 54 | header |
| 55 | echo "NTP Sources" |
| 56 | echo "--------------------------------" |
| 57 | chronyc sources -v |
| 58 | pause |
| 59 | } |
| 60 | |
| 61 | show_tracking(){ |
| 62 | header |
| 63 | echo "Chrony Tracking" |
| 64 | echo "--------------------------------" |
| 65 | chronyc tracking |
| 66 | pause |
| 67 | } |
| 68 | |
| 69 | show_activity(){ |
| 70 | header |
| 71 | echo "Chrony Activity" |
| 72 | echo "--------------------------------" |
| 73 | chronyc activity |
| 74 | pause |
| 75 | } |
| 76 | |
| 77 | # ---------------------------- |
| 78 | # 强制同步 |
| 79 | # ---------------------------- |
| 80 | |
| 81 | force_sync(){ |
| 82 | header |
| 83 | echo "尝试强制同步时间..." |
| 84 | echo |
| 85 | |
| 86 | chronyc -a makestep |
| 87 | |
| 88 | echo |
| 89 | echo "同步命令已执行" |
| 90 | pause |
| 91 | } |
| 92 | |
| 93 | # ---------------------------- |
| 94 | # 重启 |
| 95 | # ---------------------------- |
| 96 | |
| 97 | restart_service(){ |
| 98 | header |
| 99 | echo "重启 Chrony..." |
| 100 | echo |
| 101 | |
| 102 | systemctl restart $SERVICE |
| 103 | |
| 104 | echo "完成" |
| 105 | pause |
| 106 | } |
| 107 | |
| 108 | # ---------------------------- |
| 109 | # 修改NTP服务器 |
| 110 | # ---------------------------- |
| 111 | |
| 112 | change_ntp(){ |
| 113 | header |
| 114 | |
| 115 | echo "当前 NTP server" |
| 116 | grep ^server $CONF |
| 117 | echo |
| 118 | |
| 119 | read -p "输入新的 NTP 服务器: " NTP |
| 120 | |
| 121 | if [ -z "$NTP" ]; then |
| 122 | echo "未输入" |
| 123 | pause |
| 124 | return |
| 125 | fi |
| 126 | |
| 127 | cp $CONF ${CONF}.bak.$(date +%s) |
| 128 | |
| 129 | sed -i '/^server/d' $CONF |
| 130 | echo "server $NTP iburst" >> $CONF |
| 131 | |
| 132 | systemctl restart $SERVICE |
| 133 | |
| 134 | echo |
| 135 | echo "已修改并重启 Chrony" |
| 136 | pause |
| 137 | } |
| 138 | |
| 139 | # ---------------------------- |
| 140 | # 推荐NTP |
| 141 | # ---------------------------- |
| 142 | |
| 143 | recommend_ntp(){ |
| 144 | |
| 145 | header |
| 146 | |
| 147 | echo "推荐 NTP 服务器 (中国常用)" |
| 148 | echo "--------------------------------" |
| 149 | |
| 150 | cat <<EOF |
| 151 | |
| 152 | 阿里云 |
| 153 | ntp.aliyun.com |
| 154 | |
| 155 | 腾讯云 |
| 156 | time1.cloud.tencent.com |
| 157 | time2.cloud.tencent.com |
| 158 | |
| 159 | 国家授时中心 |
| 160 | ntp.ntsc.ac.cn |
| 161 | |
| 162 | 中国教育网 |
| 163 | cn.ntp.org.cn |
| 164 | |
| 165 | 公网 pool |
| 166 | 0.cn.pool.ntp.org |
| 167 | 1.cn.pool.ntp.org |
| 168 | |
| 169 | EOF |
| 170 | |
| 171 | pause |
| 172 | } |
| 173 | |
| 174 | # ---------------------------- |
| 175 | # 健康检查 |
| 176 | # ---------------------------- |
| 177 | |
| 178 | health_check(){ |
| 179 | |
| 180 | header |
| 181 | |
| 182 | echo "Chrony 健康诊断报告" |
| 183 | echo "--------------------------------" |
| 184 | |
| 185 | SERVICE_STATUS=$(systemctl is-active $SERVICE) |
| 186 | |
| 187 | if [ "$SERVICE_STATUS" = "active" ]; then |
| 188 | echo "Chrony Service: OK" |
| 189 | else |
| 190 | echo "Chrony Service: ERROR" |
| 191 | fi |
| 192 | |
| 193 | echo |
| 194 | |
| 195 | SYNC=$(timedatectl | grep "System clock synchronized" | awk '{print $4}') |
| 196 | |
| 197 | echo "System Clock Sync: $SYNC" |
| 198 | |
| 199 | echo |
| 200 | |
| 201 | TRACK=$(chronyc tracking) |
| 202 | |
| 203 | OFFSET=$(echo "$TRACK" | grep "Last offset" | awk '{print $3}') |
| 204 | LEAP=$(echo "$TRACK" | grep "Leap status" | cut -d ':' -f2) |
| 205 | |
| 206 | echo "Last Offset: $OFFSET" |
| 207 | echo "Leap Status: $LEAP" |
| 208 | |
| 209 | echo |
| 210 | |
| 211 | echo "Sources 状态" |
| 212 | echo "--------------------------------" |
| 213 | |
| 214 | chronyc sources |
| 215 | |
| 216 | echo |
| 217 | |
| 218 | # offset判断 |
| 219 | OFFSET_NUM=$(echo $OFFSET | tr -d 's') |
| 220 | |
| 221 | if [[ $(echo "$OFFSET_NUM > 0.5" | bc 2>/dev/null) -eq 1 ]]; then |
| 222 | echo "警告: 偏差超过0.5秒" |
| 223 | fi |
| 224 | |
| 225 | echo |
| 226 | echo "诊断建议" |
| 227 | echo "--------------------------------" |
| 228 | |
| 229 | if [ "$SERVICE_STATUS" != "active" ]; then |
| 230 | echo "建议: 启动 chrony 服务" |
| 231 | fi |
| 232 | |
| 233 | if [ "$SYNC" != "yes" ]; then |
| 234 | echo "建议: 检查 NTP 源或网络" |
| 235 | fi |
| 236 | |
| 237 | echo |
| 238 | pause |
| 239 | } |
| 240 | |
| 241 | # ---------------------------- |
| 242 | # 完整报告 |
| 243 | # ---------------------------- |
| 244 | |
| 245 | full_report(){ |
| 246 | |
| 247 | header |
| 248 | |
| 249 | echo "Chrony 完整诊断报告" |
| 250 | echo "================================" |
| 251 | echo |
| 252 | |
| 253 | echo "系统时间" |
| 254 | echo "--------------------------------" |
| 255 | date |
| 256 | echo |
| 257 | |
| 258 | echo "timedatectl" |
| 259 | echo "--------------------------------" |
| 260 | timedatectl |
| 261 | echo |
| 262 | |
| 263 | echo "tracking" |
| 264 | echo "--------------------------------" |
| 265 | chronyc tracking |
| 266 | echo |
| 267 | |
| 268 | echo "sources" |
| 269 | echo "--------------------------------" |
| 270 | chronyc sources -v |
| 271 | echo |
| 272 | |
| 273 | echo "activity" |
| 274 | echo "--------------------------------" |
| 275 | chronyc activity |
| 276 | echo |
| 277 | |
| 278 | pause |
| 279 | } |
| 280 | |
| 281 | # ---------------------------- |
| 282 | # 主菜单 |
| 283 | # ---------------------------- |
| 284 | |
| 285 | menu(){ |
| 286 | |
| 287 | while true |
| 288 | do |
| 289 | |
| 290 | header |
| 291 | |
| 292 | echo "1 查看系统时间" |
| 293 | echo "2 查看 Chrony 服务状态" |
| 294 | echo "3 查看 Sources" |
| 295 | echo "4 查看 Tracking" |
| 296 | echo "5 查看 Activity" |
| 297 | echo "6 强制同步时间" |
| 298 | echo "7 修改 NTP 服务器" |
| 299 | echo "8 重启 Chrony" |
| 300 | echo "9 推荐 NTP 服务器" |
| 301 | echo "10 Chrony 健康检查" |
| 302 | echo "11 完整诊断报告" |
| 303 | echo |
| 304 | echo "0 退出" |
| 305 | echo |
| 306 | |
| 307 | read -p "选择操作: " CHOICE |
| 308 | |
| 309 | case $CHOICE in |
| 310 | |
| 311 | 1) show_time ;; |
| 312 | 2) service_status ;; |
| 313 | 3) show_sources ;; |
| 314 | 4) show_tracking ;; |
| 315 | 5) show_activity ;; |
| 316 | 6) force_sync ;; |
| 317 | 7) change_ntp ;; |
| 318 | 8) restart_service ;; |
| 319 | 9) recommend_ntp ;; |
| 320 | 10) health_check ;; |
| 321 | 11) full_report ;; |
| 322 | 0) exit ;; |
| 323 | *) echo "无效选项"; sleep 1 ;; |
| 324 | |
| 325 | esac |
| 326 | |
| 327 | done |
| 328 | |
| 329 | } |
| 330 | |
| 331 | menu |