哲学上有句话:“人不能两次踏进同一条河流”,还有人说:“人甚至一次也不能踏 进同一条河流”。还好我们活在不是那么精确的时间世界,不然任何事情都做不了。 一切事物都是在某个“时间”线上才有意义,电子世界的时间尤其明显。CPU 内部 所有处理都是在时间和频率的标尺下进行。
对于操作系统来讲,硬件时间 (通常指 BIOS 时间)决定开机时候系统得到的时 间 (系统时间System Clock)。系统时间是操作系统各部分协同工作的标尺。
系统时间和硬件时间
Linux 时钟分为系统时钟(System Clock)和硬件(Real Time Clock ,简称 RTC )时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上 由电池供电的时钟,这个硬件时钟可以在 BIOS 中进行设置。当Linux 启动时, 硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。
Linux中的所有命令(包括函数)都是采用系统时钟设置,用于查看和设置时间的 命令主要有date、hwclock和clock。其中,clock和 hwclock 用法相近,只不过 clock命令除了支持x86硬件体系外,还支持 Alpha 硬件体系。
修改和更新时间
查看和设置系统时间
[root@localhost ~]# date
2008年 12月 12日 星期五 14:44:12 CST
[root@localhost ~]# date --set "1/1/09 00:01" <== (月/日/年时:分:秒)
2009年 01月 01日 星期四 00:01:00 CST
[root@localhost ~]# date
2009年 01月 01日 星期四 00:06:03 CST <== 系统时间确实改变了
[root@localhost ~]# hwclock
2008年12月12日 星期五 06时49分49秒 -0.602976 seconds < == 硬件时间没有改变
date 有几种时间格式可接受,这样也可以设置时间:
[root@localhost ~]# date 012501012009.30 <== 月日时分年.秒 2009年 01月 25日 星期日 01:01:30 CST
查看硬件时间
[root@localhost ~]# hwclock --show 2008年12月12日 星期五 06时52分07秒 -0.376932 seconds [root@localhost ~]# clock --show 2008年12月12日 星期五 06时52分15秒 -0.593257 seconds
设置硬件时间
[root@localhost ~]# hwclock --set --date="1/25/09 00:00" <== 月/日/年时:分:秒
[root@localhost ~]# hwclock
2009年01月25日 星期日 00时00分06秒 -0.870868 seconds
硬件时间和系统时间的同步
[root@localhost ~]# date
2009年 01月 01日 星期四 00:15:25 CST
[root@localhost ~]# date --set "12/12/2008 15:09"
2008年 12月 12日 星期五 15:09:00 CST
[root@localhost ~]# date
2008年 12月 12日 星期五 15:09:01 CST
[root@localhost ~]# hwclock
2009年01月25日 星期日 00时04分40秒 -0.745817 seconds
[root@localhost ~]# hwclock --systohc <== sys(系统时间)to(写到)hc(硬件BIOS)
[root@localhost ~]# hwclock
2008年12月12日 星期五 15时09分49秒 -0.962003 seconds
hwclock --hctosys 就是硬件时间写到系统上,开机的时候都会这样做。 hwclock --systohc 关机的时候都这样做。
选择时区
使用tzselect选择
配置文件 /etc/sysconfig/clock
[root@localhost ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
UTC=true
ARC=false
ZONE就是时区,可以手动创建连接文件:
[root@localhost ~]# rm -v /etc/localtime 已删除“/etc/localtime” [root@localhost ~]# ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 创建指向“/usr/share/zoneinfo/Asia/Shanghai”的符号链接“/etc/localtime”
时间同步
同国际标准时间服务器同步时间:
[root@localhost ~]# date 012500002009.00 2009年 01月 25日 星期日 00:00:00 CST [root@localhost ~]# ntpdate pool.ntp.org 12 Dec 15:40:12 ntpdate[17779]: step time server 222.73.214.1 offset -3745205.978017 sec [root@localhost ~]# date 2008年 12月 12日 星期五 15:40:19 CST [root@localhost ~]# ntpdate pool.ntp.org <== 可以使用其他时间服务器替代pool.ntp.org 12 Dec 15:40:34 ntpdate[17781]: adjust time server 222.73.214.1 offset -0.011555 sec
将
"ntpdate pool.ntp.org"加入到任务列表里面就可以自动执行了。
- 运行 crontab -e 加入到用户自己的计划任务表
- 直接加入 /etc/crontab 系统的计划任务表
任务表
0-59/30 * * * * /usr/sbin/ntpdate pool.ntp.org
建立NTP服务器
文件时间
stat 查看时间
[root@localhost ~]# stat /usr/share/fonts File: “/usr/share/fonts” Size: 4096 Blocks: 16 IO Block: 4096 目录 Device: 302h/770d Inode: 1508280 Links: 26 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-09-29 04:04:19.000000000 +0800 Modify: 2007-03-23 19:47:52.000000000 +0800 Change: 2009-09-29 03:56:40.000000000 +0800
ls —time 查看時間
--time=WORD 和 -l 同时使用时显示 WORD 所代表的时间而非修改时
间:atime、access、use、ctime 或 status;加上
--sort=time 选项时会以指定时间作为排序关键字
還是檢查上面的 /usr/share/fonts 目錄時間:
# for TIME in atime access use ctime status; do ls -ld --time=${TIME} /usr/share/fonts/; done
drwxr-xr-x 26 root root 4096 10-16 19:29 /usr/share/fonts/
drwxr-xr-x 26 root root 4096 10-16 19:29 /usr/share/fonts/
drwxr-xr-x 26 root root 4096 10-16 19:29 /usr/share/fonts/
drwxr-xr-x 26 root root 4096 09-29 03:56 /usr/share/fonts/
drwxr-xr-x 26 root root 4096 09-29 03:56 /usr/share/fonts/
可見 ls 提供的幾種查詢都不能查詢修改時間。用 stat 可以简单查询到这个时 间:
# stat -c %y /usr/share/fonts/ 2007-03-23 19:47:52.000000000 +0800
touch 修改文件时间
网上的很多关于 touch 资料有些问题了,下面的用法都基于 touch 版本:
# touch --version|head -1 touch (GNU coreutils) 5.97
系统 LANG=zh_CN.UTF-8 。
help 信息
任何时候以你系统的 help 资料为准:
# touch --help
用法:touch [选项]... 文件...
将每个<文件>的访问及修改时间都更新为目前时间。
长选项必须用的参数在使用短选项时也是必须的。
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用<字符串>表示的时间而不是目前的时间
-f (此选项不作处理)
-m 只更改修改时间
-r, --reference=FILE use this file's times instead of current time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
--time=WORD change the specified time:
WORD is access, atime, or use: equivalent to -a
WORD is modify or mtime: equivalent to -m
--help 显示此帮助信息并退出
--version 输出版本信息并退出
Note that the -d and -t options accept different time-date formats.
If a FILE is -, touch standard output.
示例:
创建文件
只是最常用创建文件的方式,也是最简单的修改文件时间方式。将文件的时间修 改为系统当前时间。若文件不存在,系统会建立一个新的文件(使用 -c 或者 —no-create 可以不创建):
touch file touch file1 file2
使用 -t 时间格式
# touch -t 05060708 touch-t [root@builder4-x86 kvm]# stat touch-t File: “touch-t” Size: 0 Blocks: 0 IO Block: 4096 一般空文件 Device: 80ah/2058d Inode: 17039363 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-05-06 07:08:00.000000000 +0800 Modify: 2009-05-06 07:08:00.000000000 +0800 Change: 2009-10-16 14:20:08.000000000 +0800
"-t 05060708" 将时间设置为 5月6日7点8分,年份为当前年份。如果想设置年份:
# touch -t 301005060708 touch-t # stat touch-t File: “touch-t” Size: 0 Blocks: 0 IO Block: 4096 一般空文件 Device: 80ah/2058d Inode: 17039363 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 3010-05-06 07:08:00.000000000 +0800 Modify: 3010-05-06 07:08:00.000000000 +0800 Change: 2009-10-16 16:57:19.000000000 +0800
"-t 301005060708" 设置时间为 3010年5月6日7时8分。
下面命令将 touch-t2 文件时间设置为与 touch-t 一样,如果 touch-t2 文件不 存在就创建一个:
# touch -r touch-t touch-t2
# touch -d 23:59 touch-t # ==> 设置时间为 23:59 # touch -d "01:02pm" touch-t # ==> am,pm 对应上下午
如果没有指定时间,默认为 00:00:00。(下面示例我都实验过)
# touch -d 21000102 touch-t # ==> 2100年1月2日00:00:00 # touch -d 05/06/2345 touch-t # ==> 2345年5月6日00:00:00 # touch -d "07:08am 05/06/2345" touch-t # ==> 上午 7点8分 # touch -d "12340506 7:8am" touch-t # ==> 1234年5月6日7时8分 # touch -d "21430506 09:08:07" touch-t
文件时间综合示例
创建一个文件 touch.example ,用 stat 查询时间:
# touch touch.example # stat touch.example File: “touch.example” Size: 0 Blocks: 0 IO Block: 4096 一般空文件 Device: 302h/770d Inode: 783622 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-10-16 19:40:08.000000000 +0800 Modify: 2009-10-16 19:40:08.000000000 +0800 Change: 2009-10-16 19:40:08.000000000 +0800
写入一些内容,查看文件的那个时间发生改变:
# echo "Time test" > touch.example # stat touch.example File: “touch.example” Size: 10 Blocks: 8 IO Block: 4096 一般文件 Device: 302h/770d Inode: 783622 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-10-16 19:40:08.000000000 +0800 Modify: 2009-10-16 19:44:08.000000000 +0800 Change: 2009-10-16 19:44:08.000000000 +0800
可见用 echo 输入一些字符串重定向到文件中, 只有 access 时间没有改变。等 待一小会儿,用 vi 打开文件,先不编辑直接退出。
# stat touch.example File: “touch.example” Size: 10 Blocks: 8 IO Block: 4096 一般文件 Device: 302h/770d Inode: 783622 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-10-16 19:46:48.000000000 +0800 Modify: 2009-10-16 19:44:08.000000000 +0800 Change: 2009-10-16 19:44:08.000000000 +0800
虽然我们只是打开了文件,没有做任何修改,都是 access 时间还是改变了!
现在再用 vi 打开文件添加一些信息保存退出。
# stat touch.example File: “touch.example” Size: 20 Blocks: 8 IO Block: 4096 一般文件 Device: 302h/770d Inode: 783624 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2009-10-16 19:48:12.000000000 +0800 Modify: 2009-10-16 19:48:12.000000000 +0800 Change: 2009-10-16 19:48:12.000000000 +0800
可以看到,当修改文件后,所有时间都变成一致。
现在用 touch 修改时间:
# touch -a -t 0102030405 touch.example # stat touch.example File: “touch.example” Size: 20 Blocks: 8 IO Block: 4096 一般文件 Device: 302h/770d Inode: 783624 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2001-02-03 04:05:00.000000000 +0800 Modify: 2009-10-16 19:48:12.000000000 +0800 Change: 2009-10-16 21:33:00.000000000 +0800
通过 stat 命令可以看到,
