最後活躍 1773419237

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

修訂 eea6c985c8255d0474e591b79434d7a50b93e4c5

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