zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux管理员手册(9)--KeepingTime

Linux -- 手册 管理员
2023-06-13 09:13:45 时间
本章说明Linux系统如何keepstime,及需要做什么来避免发生问题。通常,你无须对时间做什么,但理解它会更好。

  时区

  时间测量基于最规则的自然现象,如地球转动导致的昼夜更替。昼夜总时间是恒定的,但昼夜分别的长度是变化的。一个简单的常数是正午。

  正午是白天太阳在最高点的时间。由于地球是圆的,不同地方正午发生在不同的时间。这引出了本地时localtime的概念。

  硬件时钟和软件时钟

  个人计算机有一个电池驱动的硬件时钟。电池保证始终在计算机没电的时候依然能工作。硬件始终能从BIOS设置屏或操作系  统的别的地方进行设置。

  Linux核心独立于硬件始终跟踪时间。启动时,Linux根据硬件时钟设置自己的时钟。此后,2个始终相互独立运行。因为查看硬件始终慢而复杂,因此Linux管理自己的时钟。

  核心始终一直显示通用时间。这样,核心无须知道时区,高可靠的简单结果使更新时区信息更简单。每个进程自己处理时区转换(使用时区包部分里的标准工具)。

  硬件始终可以是本地时间或通用时间。通常用通用时间更好,因为这样你无须在夏时制开始或结束时改变硬件时钟(UTCdoesnothaveDST)。不幸的是,有些PC操作系统,包括MSDOS、Windows、OS/2都假设硬件时钟是本地时间。Linux可处理2种方式,但如果硬件时钟显示本地时间,那么必须在夏时制开始或结束时(否则就不能显示本地时间)。

  显示和设置时钟

  在Debian系统中,系统时区由符号连接/etc/localtime决定。连接指向描述本地时区的时区数据文件。时区数据文件存在/usr/lib/zoneinfo中。其他Linuxdistributions可能不同。

  用户可以用设置TZ环境变量来改变他的私人时区。如果不设置,就假定是系统时区。TZ变量的语法在tzset(3)man页中说明。

  date命令显示当前日期和时间。例如:

  $date
  SunJul1421:53:41EETDST1996
  $
  ThattimeisSunday,14thofJuly,1996,atabouttenbeforetenattheevening,inthetimezonecalled``EETDST""(whichmightbeEast      EuropeanDaylightSavingsTime).date也可用于显示通用时间:
  $date-u
  SunJul1418:53:42UTC1996
  $
  date也可用于设置核心的软件始终:
  #date07142157
  SunJul1421:57:00EETDST1996
  #date
  SunJul1421:57:02EETDST1996
  #

  更详细的见dateman页--syntaxisabitarcane.只有root能设置时间。虽然每个用户可以有自己的时区,但时钟对每个人都是一样的。

  date只显示或设置软件时钟。clock命令同步硬件和软件时钟。用于系统启动时读取硬件时钟和设置软件时钟。如果两个时钟都需要设置,则先用date设置软件时钟,然后用clock-w设置硬件时钟。

  clock的-u告诉它硬件时钟是通用时间。必须正确使用-u选项。否则计算机将困惑到底是什么时间。

  时钟必须小心改变。Unix系统的许多部分要求时钟工作正常。例如,cron守侯程序周期地运行命令。如果改变时钟,它可能迷惑它是否该运行命令。OnoneearlyUnixsystem,someonesettheclocktwentyyearsintothefuture,andcronwantedtorunalltheperiodiccommandsfortwentyyearsallatonce.现在版本的cron可以正确处理,但仍然要小心。大的前后跳跃比小的更危险。

  当时钟错误时

  Linux软件时钟不会始终精确。PC硬件产生的时间中断周期地运行软件时钟。如果系统运行了太多进程,服务于时间中断需要花费太多的时间,软件时钟启动靠后。硬件时钟独立运行并通常更精确。如果你的系统经常启动(比如不是服务器的多数系统),那么通常时间很精确。

  如果需要调整硬件时钟,通常最简单的是重启动,进入BIOS设定屏幕,并在那里完成。这避免了改变系统时间可能导致的所有问题。如果不能通过BIOS,用date和clock设定新时间(以此顺序),但如果系统有部分工作不正常,必须准备重启动。

  连网的计算机(即使是通过modem)能通过与其他计算机时间比较来自动检查自己的时钟。如果知道保持很精确时间的其他计算机,那么2台计算机都将保持精确的时间。这可以使用rdate和netdate命令来完成。2个命令都检查远程的计算机(netdate可处理多台远程计算机),来同步本地计算机的时间。有规律地运行这样一个程序,你的计算机就可以保持与远程计算机一样精确的时间。

  测量孔(MeasuringHoles)

  本附录包括用于测量文件系统中潜在的孔的程序的有趣的部分。Thesourcedistributionofthebookcontainsthefullsourcecode(sag/measure-holes/measure-holes.c).

  intprocess(FILE*f,char*filename){
  staticchar*buf=NULL;
  staticlongprev_block_size=-1;
  longzeroes;
  char*p;

  if(buf==NULL||prev_block_size!=block_size){
  free(buf);
  buf=xmalloc(block_size+1);
  buf[block_size]=1;
  prev_block_size=block_size;
  }
  zeroes=0;
  while(fread(buf,block_size,1,f)==1){
  for(p=buf;*p=="\0";)
  ++p;
  if(p==buf+block_size)
  zeroes+=block_size;
  }
  if(zeroes>0)
  printf("%ld%s\n",zeroes,filename);
  if(ferror(f)){
  errormsg(0,-1,"readfailedfor`%s"",filename);
  return-1;
  }
  return0;
  }