我第1个可用的golang小程序 – Go语言中文网 – Golang中文社区

来源: 我第1个可用的golang小程序 – Go语言中文网 – Golang中文社区

  1. 为什么要写这个程序
  2. 寻找时间同步Api
  3. 编写同步程序
  4. 封装成windows service

 

  1. 为什么要写这个程序        一直在关注golang, 从2011年4月配置环境写了个hello world!(http://weibo.com/1409046677/wr4n3vdYFV), 后来没再动手写golang代码了, 只是关注golang方面的信息/资讯。去年到今年稍认真的看了一些golang的基础语法,然后前几天家里的台式电脑又开机用了一下,可能是bios电池没电的原因吧, 总是开机后需要重新设置时间。于是就想不如用golang写个windows服务自动更新系统时间,就这样才有了今天这个golang小程序。

    另外可能有人会说使用windows时间同步功能就行了,没必要麻烦。这里我的主要目的是突然兴趣所使想用golang练手,其次是windows自带的时间同步功能可能由于墙的原因不好使,反正我手动同步都没有成功过,如图:

  2. 寻找时间同步Api        搜索资料时了解到Network Time Protocol(NTP)(http://baike.baidu.com/view/60648.htm)能很精准的同步时间,我不要那么高要求,只是获取最新时间,更新时间就行,所以得在网上找个可用的能获取最新时间API,开始担心墙,想找国内的,百度有一个http://open.baidu.com/special/time/,但是个页面,不是我想要的,最后确定使用国外的http://www.earthtools.org/timezone-1.1/35.86166/104.195397
  3. 编写同步程序        挺简单的一个小程序,思路就是获取API数据,取到时间,然后设置到系统时间,由于还不熟悉golang的api,不知道怎样使用golang来更新系统时间,后来就使用golang调用dos命令来更新。

    在编写代码时,明明知道在golang中,大小写分别表示public和private,但在定义Timezone结构体,里面的变量使用小写,导致总是取不到正确的数据,折腾了不少时间。另外为了ISO-8859-1编码花了点时间找资料。

  4. 封装成windows service        关于编写windows service,开始搜索到资料http://sanatgersappa.blogspot.com/2013/07/windows-service-with-go-easy-way.html (需要FQ),感觉NSSM(http://nssm.cc/)挺方便的,考虑使用NSSM程序,使用NSSM把exe程序注册成windows服务,命令:

    nssm install MyService d:\MyService.exe
    (where d:\MyService.exe is the full path to the exe file).

    我当时就写了2个批处理程序CreateService.bat:
    nssm install SyncSystemTimeService %CD%\SyncSystemTim.exe

    DeleteService.bat:
    sc delete SyncSystemTimeService

    windows服务注册成功了,启动SyncSystemTimeService服务后,我的程序好像并没有生效,我怀疑要么必须使用完整的路径(不能用%CD%变量), 要么可能使用%~dp0而不是%CD%(参考资料:http://stackoverflow.com/questions/16255184/how-do-i-find-the-current-directory-of-a-batch-file-and-then-use-it-for-the-pat),后来我没有继续查原因,在网上找到了使用golang写的一个服务程序:http://bitbucket.org/kardianos/service, 把代码拉下来,调整一下就达到我想要的要求。

分享到: 更多 (0)