Последняя активность 1773419237

使用chrony进行系统的时间检查功能:其中chrony-doctor.sh是个大而全的脚本

Версия 572e9529af01851f7c0c88855a8fe443f35dc8c6

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