系统时钟

大多数计算机系统实际上拥有两个24小时的时钟:硬件时钟和系统时钟。由电池供电的硬件时钟嵌在系统硬件中。用于在系统关闭时记录时间。系统时钟是与硬件时钟相对应的软版本,在系统初始化时创建,它根据硬件时钟进行设置。

在大多数Unix系统上,硬件时钟用于保存世界标准时间(UTC)也称为格林威治时间(GMT),而不是系统所在时区的时间。

在启动一个基于Unix的系统时,其中一个初始化脚本运行hwclock程序,该程序将当前的硬件时钟复制给系统时钟。Unix正是通过系统时钟(也称为内核时钟或软件时钟)来获取当前的时间和日期的。

要检查和设置系统时钟,使用命令date,如果没有参数,该命令将返回当前的日期和时间:

-bash-3.00$ date
Mon Jun 20 10:17:01 CST 2011
 

假设要将当前的时间设置为2011年1月1日,00:01:30,即新年过后的一分半钟,date命令需要以CCYYMMDDhhmm.ss格式表示正确的参数,其中CCYY是4位数字的年份;MMDD前两位数字表示月,后两位数字表示天;hhmm.ss是两位数字的小时,分b和秒。

% sudo date 201101010001.31

在Linux上利用hwclock同步时钟

hwclock命令用于查询和设置硬件时钟,如果没有参数,该命令将显示当前设置:

$ /sbin/hwclock

Tue 30 Nov 2004 02:50:43 PM CST  -0.600758  seconds

hwclock 命令没有位于用户的可执行程序路径中,因为许多系统,包括各种Linux发布版本,都将只能由根用户使用的命令和其他程序放在称为/sbin目录中,

要同步硬件时钟和系统时钟,hwclock命令需要--systohc开关

$ sudo /sbin/hwclock --systohc

如果硬件时钟设置为UTC,那么还需要一个额外的开关--utc

利用NTP同步系统时钟

另一个维持时钟秩序的常用工具是使用网络时间协议NTP,利用该工具可以同步系统和外部系统,这需要连接到网络上。如果系统总是在启动时就具有网络连接,那么系统可能会跳过与硬件时钟的同步。使用ntpdate(通过在ntpd软件包内)从一个基于网络的时间服务器来初始化系统时钟。

$ sudo ntpdate

10  Dec 19:35:39 ntpdate [3736]:step time server 17.254.0.27 offset -11.081510 sec

NTP不仅提供了用于传输当前时间的方法,还考虑到传输中的延迟,提供了额外的精确级别。

在许多Unix 类型的系统上,在/etc/ntp.conf文件中配置NTP:

    server ntp.local.com prefer

    server time.apple.com

    driftfile /var/db/ntp.drift

server选项指定将要使用的服务器,每个服务器自成一行。如果为服务器指定prefer选项则做为首选服务器。系统首先使用首选服务器响应,除非该响应与所列的其他服务器的响应之间有很大的差别。

driftfile选项指定一个文件,用以存储系统时钟的频率偏移信息。如果切断ntpd与所有外部时间源的联系,并持续一段时间,那么ntpd使用该信息来自动弥补时钟的自然偏移。

安装将来运行的命令

利用cron执行程序

cron程序使得Unix用户能够在指定的时间和/或日期执行命令、脚本和应用程序。cron使用一个Unix守护进程(称为crond),该进程只需要启动一次,通常在系统启动时运行,并且一直处于潜伏状态,直到需要用到它时为止。什么时候需要用到它呢?在从某个配置文件或crontab运行指定的命令、脚本或应用程序时需要用到crond守护程序。

启动cron

$ sudo cron

$

该进程自动转到后台运行。

在大多数的Unix发布版本上,crond是自动安装的,将在系统启动时运行,使用ps命令验证该守护进程。

$ ps auwx | grep cron

实例:备份个人主目录正下的docs目录

1、创建一个新目录,命名为backups

$ mkdir backups

$

2、在文本编辑器中打开cron配置文件/etc/crontab(需要超级用户权限)

$sudo vi /etc/crontab

该文件内容类似于:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

#Adjust the time zone if the CMOS clock keeps local time, as opposed to

#UTC time. see adjkerntz(8) for details.

1,31 0-5 * * * root adjkerntz -a

#run reports on networks usage

*/5 * * * * root /usr/local/bin/mrtg  /usr/local/etc/mrtg/mrtg.conf

......

在这个文件的末尾添加如下内容:

# copy docs directory to a local backup directory every hour

# entered by (your name) on (today's date) .version 1.0

0 * * * *  userid cp -r ~~username/docs ~username/backups

在下一个小时开始运转backups目录并查看详细的目录列表:

$ ls -l

total 1

drwxr-xr-x  0  userid userid 4096  Feb  8  14:00  docs

$

工作原理

SHELL cron将在其下运行的shell。

PATH    包含在cron搜索路径的目录

MAILTO  如果cron正在运行的命令有输出,那么将每个命令的输出以电子邮件的形式传送给指定的用户。如果没有指定,那么将传送给产生该输出的进程所有者。

HOME    为cron应用程序指定的主目录。

corntab文件的第二部分定义了时间和内容的状况,其细节在一系列由空格分隔的字段中设置,一个记录通常有7个字段。

1、分钟:取值0~59

2、小时:使用24小时制,取值0~23。其中0代表午夜,*代表每个小时。

3、日期:命令在每月的第几天运行,取值(1-31),*代表每一天。

4、月份:取值1-12,*代表每个月。

5、星期:取值0-7,0和7都代表星期日。

6、用户:运行该命令的用户。

7、命令名称:所要调用的命令。

注意应该适当的注释crontab文件,并尽量将注释本身放在单独的行上。

构建复杂的调度

如果需要在多个小时执行,但又不是每个小时都执行,可以在一个字段中安排多个事件,用逗号将所有的实例隔开,之间没有空格。例如每隔一小时的第一分钟运行脚本,从午夜开始:

1 0,2,4,6,8,10,12,14,16,18,20,22 * * *  userid cp -r ~~username/docs ~username/backups

如果指定了日期和星期字段,那么任何一个事件发生时都将执行该命令。

* 12 16 * 1 userid cp -r ~~username/docs ~username/backups

如果只希望在周一到周五调用备份,可以这样:

* * * * 1-5 userid cp -r ~~username/docs ~username/backups

还可以使用步值的方法,例如果备份数据需要在每天中每隔5小时运行一次,使用语法“*/5”其中*代表每个可能的小时/5代表每次间隔的小时。

* */5 * * * userid cp -r ~~username/docs ~username/backups

Linux上的报告和日志更新

cron的另一个常见用法是管理系统日志并产生productive使用报告。例如,在大多数Linux发布版本的4个/etc子目录下有许多生成报告的脚本,这4个子目录分别是:cron.hourly、cron.daily、cron.weekly和cron.monthly。cron运行这些目录下的脚本,周期分别是每小时、每天、每周和每月。

$ ls

00-logwatch        inn-cron-expire        rhnchck        systat

00webalizer         logrotate                  rpm              tmpwatch

0anacron             makewatis.cron        slocate.cron  tripwire-check

$

00webalizer是一个shell脚本示例,用于处理web服务器日志

下面crontab记录项说明这些程序报告需要使用根用户权限来执行

下面是含有四个日志子目录的crontab文件的示例:

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

管道cron的输出

如果需要将输出以电子邮件的形式发送给其他人,可以使用Unix管道,将输出通过管道传给mail命令,注意,调用mail命令时需要使用-s开关,这个开关将所要发送的电子邮件的主题设置为在开关后提供的字符串:

0 * * * * userid cp -r ~username/docs ~username/backups | mail -s "backup script output" username

还可以重定向到日志文件

0 * * * * userid cp -r ~username/docs ~username/backups >> log.file

控制对cron的访问

可以通过使用/etc/cron.allow和/etc/cron.deny文件来实现指定有权限和无权限使用cron的用户。

如果这两个文件都没有,那么cron的使用将不受限制。

crontab

授予所有用户访问/etc/crontab的权力是不明智的,让每个用户拥有自己的crontab文件要好得多,可以使用crontab命令创建、编辑和删除这些文件。该命令创建个人crontab文件,它通常存储在/var/spool/cron/crontabs/user,但也可能在其他地方找到该命令,这取决于使用的Unix风格。

-e    编辑当时的crontab文件或者创建一个新的crontab文件。

-l     列出crontab文件的内容。

-r     删除cronbat文件。

使用at命令进行一次性执行

要安排一个命令、一系列命令或者脚本在指定时间运行,而且只执行一次,那么可以用at命令代替cron。

下面的例子执行一个重要文档的一次性备份

$ at 17:00

at>cp important_report.swx -username/backups

按ctrl+d以退出at shell;将看到类似下面的内容:

job 1 at 2004-12-10  17:00

$

使用atq可以再次确认作业已经安排好

要在执行某个命令之前将其删除,使用atrm命令

控制对at的访问

与cron一样,Unix管理员能够控制哪些用户有权使用at。使用/etc/at.allow或者/etc/at.deny两个文件来控制访问at的权限。