Dernière activité 1773419237

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

Révision df88121a86f1028c919490b040fbd1f1969a0888

chrony-doctor.sh Brut
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 Brut
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 Brut
1#!/usr/bin/env bash
2
3# ==============================
4# Chrony 管理工具
5# ==============================
6
7CHRONY_CONF="/etc/chrony.conf"
8SERVICE_NAME="chronyd"
9
10if systemctl list-unit-files | grep -q chrony.service; then
11 SERVICE_NAME="chrony"
12fi
13
14pause(){
15 echo
16 read -p "按回车返回菜单..."
17}
18
19print_header(){
20 clear
21 echo "======================================"
22 echo " Chrony 时间同步管理工具"
23 echo "======================================"
24 echo
25}
26
27check_chrony_install(){
28 if ! command -v chronyc &>/dev/null; then
29 echo "未检测到 chrony,请先安装"
30 echo "CentOS/RHEL: yum install chrony"
31 echo "Debian/Ubuntu: apt install chrony"
32 exit 1
33 fi
34}
35
36# 当前时间
37show_time(){
38 print_header
39 echo "系统当前时间"
40 echo "----------------------------"
41 date
42 echo
43 echo "timedatectl 信息"
44 echo "----------------------------"
45 timedatectl
46 pause
47}
48
49# Chrony服务状态
50chrony_status(){
51 print_header
52 echo "Chrony 服务状态"
53 echo "----------------------------"
54 systemctl status $SERVICE_NAME --no-pager
55 pause
56}
57
58# Chrony源
59show_sources(){
60 print_header
61 echo "NTP 来源服务器"
62 echo "----------------------------"
63 chronyc sources -v
64 pause
65}
66
67# Chrony tracking
68show_tracking(){
69 print_header
70 echo "Chrony tracking 信息"
71 echo "----------------------------"
72 chronyc tracking
73 pause
74}
75
76# Chrony统计
77show_activity(){
78 print_header
79 echo "Chrony 活动源"
80 echo "----------------------------"
81 chronyc activity
82 pause
83}
84
85# 强制同步
86force_sync(){
87 print_header
88 echo "尝试立即同步时间..."
89 echo
90
91 chronyc -a makestep
92
93 echo
94 echo "同步完成"
95 pause
96}
97
98# 重启服务
99restart_chrony(){
100 print_header
101 echo "重启 Chrony 服务..."
102 echo
103
104 sudo systemctl restart $SERVICE_NAME
105
106 echo "完成"
107 pause
108}
109
110# 查看配置
111show_config(){
112 print_header
113 echo "当前 chrony.conf"
114 echo "----------------------------"
115 cat $CHRONY_CONF
116 pause
117}
118
119# 修改NTP服务器
120modify_ntp(){
121 print_header
122 echo "当前 NTP server 配置"
123 echo "----------------------------"
124 grep ^server $CHRONY_CONF
125 echo
126
127 read -p "输入新的 NTP 服务器 (例如 ntp.aliyun.com): " ntpserver
128
129 if [ -z "$ntpserver" ]; then
130 echo "未输入"
131 pause
132 return
133 fi
134
135 sudo cp $CHRONY_CONF ${CHRONY_CONF}.bak.$(date +%s)
136
137 sudo sed -i '/^server/d' $CHRONY_CONF
138
139 echo "server $ntpserver iburst" | sudo tee -a $CHRONY_CONF >/dev/null
140
141 echo
142 echo "配置已更新"
143 echo "正在重启 chrony..."
144
145 sudo systemctl restart $SERVICE_NAME
146
147 echo "完成"
148 pause
149}
150
151# 综合检测
152full_check(){
153 print_header
154 echo "系统时间"
155 echo "----------------------------"
156 date
157 echo
158
159 echo "timedatectl"
160 echo "----------------------------"
161 timedatectl
162 echo
163
164 echo "Chrony tracking"
165 echo "----------------------------"
166 chronyc tracking
167 echo
168
169 echo "Chrony sources"
170 echo "----------------------------"
171 chronyc sources -v
172 echo
173
174 echo "Chrony activity"
175 echo "----------------------------"
176 chronyc activity
177 pause
178}
179
180menu(){
181 while true
182 do
183 print_header
184
185 echo "1 查看系统时间"
186 echo "2 查看 Chrony 服务状态"
187 echo "3 查看 NTP 来源 (sources)"
188 echo "4 查看 Chrony tracking"
189 echo "5 查看 Chrony activity"
190 echo "6 强制同步时间"
191 echo "7 查看 chrony.conf"
192 echo "8 修改 NTP 服务器"
193 echo "9 重启 Chrony"
194 echo "10 综合检测"
195 echo
196 echo "0 退出"
197 echo
198 read -p "请选择操作: " choice
199
200 case $choice in
201 1) show_time ;;
202 2) chrony_status ;;
203 3) show_sources ;;
204 4) show_tracking ;;
205 5) show_activity ;;
206 6) force_sync ;;
207 7) show_config ;;
208 8) modify_ntp ;;
209 9) restart_chrony ;;
210 10) full_check ;;
211 0) exit ;;
212 *) echo "无效选项"; sleep 1 ;;
213 esac
214 done
215}
216
217check_chrony_install
218menu