//build: 20240523 //同步时间,运行时需要把这个组件加载到一个线程里的while循环, //缺省每隔24小时同步一次,也支持事件触发主动同步 eventcetner.fire(ntp.MANUAL_SYNC) //依赖组件 dxLogger,dxCommon,dxCenter import common from "./dxCommon.js" import dxNet from './dxNet.js' import log from './dxLogger.js' const ntp = {} /** * 同步时间循环初始化 * @param {string} server 同步时间服务器地址,缺省是182.92.12.11 * @param {number} interval 同步时间的间隔,单位是分钟,缺省是24小时同步一次 * */ ntp.beforeLoop = function (server = '182.92.12.11', interval = 24 * 60) { this.server = server this.interval = interval this.tempinterval = 1000//第一次隔1秒就开始第一次对时 this.last = new Date().getTime() } /** * 更新时区GMT,比如8,表示GMT8北京时间 * @param {number} gmt 取值范围是0,1,2....24表示时区, */ ntp.updateGmt = function (gmt) { if (gmt != undefined && gmt != null) { let cmd = `cp /etc/localtimes/localtime${gmt} /etc/localtime` common.systemBrief(cmd) } } /** * 立刻同步 */ ntp.syncnow = false /** * 同步时间 */ ntp.loop = function () { if (!dxNet.getStatus().connected) {//没有网络 return } const now = new Date().getTime() const minus = now - this.last if (ntp.syncnow || (minus > (this.tempinterval))) { ntp.syncnow = false let cmd = `ntpdate -u -t 1 '${this.server}' > /dev/null && echo 'Y' || echo 'N'` let res = common.systemWithRes(cmd, 100).split(/\s/)[0] if (res != "Y" ) { // 对时失败,1分后重试 log.error('ntp sync failed') this.tempinterval = 60 * 1000 } else { // 对时成功 log.info('ntp sync success') this.tempinterval = this.interval * 60 * 1000 common.systemBrief("hwclock -u -w") } this.last = new Date().getTime() } } export default ntp;