我们知道一个服务器是时间的准确非常重要,但是往往由于各种原因服务器的时间会出现不准确的情况。linux对这种情况也比较重要,有一个专门的服务用来进行服务器时间的同步。
ntpdata用来和授时中心连接进行时间的同步。用法:ntpdata 授时中心域名。
常见的授时中心列表如下:
微软公司授时主机(美国)
time.windows.com
台警大授时中心(台湾)
asia.pool.ntp.org
中科院授时中心(西安)
210.72.145.44
网通授时中心(北京)
219.158.14.130
有了这个服务,我们只要把它加入crontab即可实现自动的时间同步。
说到crotab我们对其进行介绍一下,他就是linux下大名鼎鼎的自动守护程序,他可以定时自动执行一些脚本。在实现系统的一些日常必须的任务他非常有用。
crotab的用法:
crontab -u
#设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l
#列出某个用户cron服务的详细内容
crontab -r
#删除某个用户的cron服务
crontab -e
#/编辑某个用户的cron服务
crontab内的基本编辑格式如下
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /etc/init.d/smb restart
上面的例子表示每晚的21:30重启smb 。
45 4 1,10,22 * * /etc/init.d/smb restart
上面的例子表示每月1、10、22日的4 : 45重启smb 。
10 1 * * 6,0 /etc/init.d/smb restart
上面的例子表示每周六、周日的1 : 10重启smb 。
0,30 18-23 * * * /etc/init.d/smb restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启smb 。
0 23 * * 6 /etc/init.d/smb restart
上面的例子表示每星期六的11 : 00 pm重启smb 。
* */1 * * * /etc/init.d/smb restart
每一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
每月的4号与每周一到周三的11点重启smb
0 4 1 jan * /etc/init.d/smb restart
一月一号的4点重启smb
有了以上的基础知识,我们要实现的任务就非常简单了:
我们编辑crontab给其添加一个任务实现每天中午12点连接授时中心进行时间同步。
#crontab -e
输入 0 12 * * * ntpdate asia.pool.ntp.org >> /var/log/ntpdate.log
保存退出
系统每天12:00就会自动去asia.pool.ntp.org 同步时间,并将同步的日志放到/var/log/ntpdate.log
当然这个自动授时需要服务可以连上网络才行,如果你的服务器不能上网怎么办(oh,my god 不能上网的服务器)。这就得手动修改时间了,当然就无法自动同步了,只能你手动同步了。
date -s 可以进行时间设置
比如将系统时间设定成2010年9月16日的命令如下。
#date -s 09/16/10
将系统时间设定成上午10点12分0秒的命令如下。
#date -s 10:12:00
但是往往有一个需要注意的问题时,linux时间的不准往往是由于系统启动时候会从CMOS获得时间,当cmos时间不准时候,修改后马上重启系统,时间就又会不准了。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。
为了解决这个问题,我们使用强制往CMOS写入时间保持设定时间有效。
clock -w
这个命令强制把系统时间写入CMOS