系统时间和硬件时间
修改和更新时间
选择时区
时间同步
建立NTP服务器
文件时间
stat 查看时间
ls —time 查看時間
touch 修改文件时间

哲学上有句话:“人不能两次踏进同一条河流”,还有人说:“人甚至一次也不能踏 进同一条河流”。还好我们活在不是那么精确的时间世界,不然任何事情都做不了。 一切事物都是在某个“时间”线上才有意义,电子世界的时间尤其明显。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" 加入到任务列表里面就可以自动执行了。

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 命令可以看到,