开始为系统建立计划任务之前,需要为系统添加相关设置,以确保计划任务能够正确运行。计划任务需要的支持主要包括两个方面:正确运行系统服务、准确的系统时间。
1、正确运行系统服务
为系统添加计划任务之前,必须要确保计划任务相关的服务已经正确启动。为计划任务提供支持的系统服务是crond和atd,因此必须保证这两个服务能随系统自动启动。
设置crond、atd服务随系统自动启动:
[root@localhost ~]# chkconfig crond on
[root@localhost ~]# chkconfig atd on
设置crond、atd服务的自启动状态后,可能还需要手动启动服务:
[root@localhost ~]# service crond start Starting crond: [ OK ] [root@localhost ~]# service atd start Starting atd: [ OK ]
2、校准系统时间
由于时间的推移,系统时间也会逐渐变得不准确。使用date命令逐一修改系统时间,是非常不现实的,此时推荐使用NTP通过网络同步时间。
通过网络同步时间的命令是ntpdate。使用这个命令需要一个有效的时间服务器地址。时间服务器地址通常可以通过网络搜索得到,也可以查询CERNET网络中心的时间服务器地址列表,或直接使用中国国家授时中心地址。
CERNET网络中心时间服务器地址列表:http://www.time.edu.cn/mem.htm
中国国家授时中心地址:210.72.145.44
[root@localhost ~]# ntpdate pool.ntp.org 12 Dec 16:37:30 ntpdate[20233]: adjust time server 202.112.10.36 offset -0.121841 sec
#使用hwclock命令的w选项将系统时间同步到硬件时钟
[root@localhost ~]# hwclock -w
cron是Linux系统中的计划任务调度程序,其功能是允许用户自定义计划任务。计划任务可在指定时间一次或多次执行任务(例如每天凌晨4点执行备份、每过15分钟收集系统磁盘信息等)。
【计划任务格式】
* * * * * command
上面的格式中,最前面由空格分隔的几个星号“*”表示任务执行的日期和时间,后面的command表示要执行的命令或脚本。
日期和时间使用空格作为字段分隔符,这些字段从左起,含义依次为:
字段1:表示分钟,取值范围1-59.
字段2:表示小时,取值范围0-23.
字段3:表示日期,取值范围1-31.
字段4:表示月份,取值范围1-12.
字段5:表示星期,取值范围0-6(0表示星期天)。
使用上面的格式表示时间时,可以使用几个比较简单的特殊字符,这些特殊字符及含义如下:
减号“-”:表示一个范围。例如“1-5”在月份字段上表示1月到5月。
星号“*”:表示每个单位时间。例如日期字段的星号表示每天,小时字段则表示每小时等。
逗号“,”:表示一个列表。例如在星期字段中的“0,1,3,5”表示在每周的星期天、星期一、星期三和星期五。
井号“#”:表示注释行。
斜杠“/”:表示一个分隔时间段。例如在分钟字段使用“*/30”表示每隔30分钟。
各个字段都要用空格隔开。
【计划任务示例】
(1)每月1日凌晨4点运行/file/backup/backup_full.sh脚本文件:
* 4 1 * * /file/backup/backup_full.sh
(2)每天凌晨4点运行/file/backup/backup.sh:
0 4 * * * /file/backup/backup.sh
(3)在每周星期六、星期日的19点至24点,每隔15分钟运行脚本/file/net.sh:
*/15 19-24 * * 6,0 /file/net.sh
【命令格式】
crontab [option]
【常用选项】
通常不需要参数。常用的选项如下:
u:指定要操作的系统用户。
e:编辑计划任务。
r:删除计划任务。
l:查看已经存在的计划任务列表。
【用法示例】
(1)添加一个计划任务,每隔20分钟与时间服务器pool.ntp.org同步一次,可以使用crontab命令的选项e建立计划任务:
[root@localhost ~]# crontab -e
此时将会弹出一个交互式页面,实际为vim编辑器,按i键插入一下内容:
#每隔20分钟与时间服务器同步一次时间,并写入硬件时钟 #Synchronize the time every 20 minutes. */20 * * * * /usr/sbin/ntpdate pool.ntp.org &>/dev/null ; /sbin/hwclock -w &>/dev/null
添加完成后,按下ESC,在末行模式下输入:wq保存退出即可生效。
添加计划任务时,建议为每一个计划任务添加详细的备注,以方便后期维护。
注意:上面的计划任务中使用了命令的全路径,这是因为在cron中不提供环境变量,因此所有命令和脚本都应该使用全路径。
(2)查看已经存在的计划任务:
[root@localhost ~]# crontab -l #Synchronize the time every 20 minutes. */20 * * * * /usr/sbin/ntpdate pool.ntp.org &>/dev/null ; /sbin/hwclock -w &>/dev/null
(3)删除所有的计划任务:
[root@localhost ~]# crontab -r [root@localhost ~]# crontab -l no crontab for root
如果有很多计划任务列表,为避免人工操作的失误(选项e和r在键盘上的位置很近),应该备份计划任务。
备份计划任务命令:crontab –l >backup_filename
[root@localhost ~]# crontab -l >root_cron
导入备份时命令:crontab backup_filename
[root@localhost ~]# crontab -r [root@localhost ~]# crontab -l no crontab for root [root@localhost ~]# crontab root_cron [root@localhost ~]# crontab -l #Synchronize the time every 20 minutes. */20 * * * * /usr/sbin/ntpdate pool.ntp.org &>/dev/null ; /sbin/hwclock -w &>/dev/null
默认情况下,系统中所有用户都可以使用cron计划任务,但有些管理员可能不希望某些用户使用计划任务,这是管理员就需要管理用户的计划任务。
(1)root用户可以使用选项u管理普通用户的计划任务。例如查看用户zhu的计划任务:
[root@localhost zhu]# crontab -u zhu -l #just a test * 18 * * * /home/zhu/test.sh
(2)默认情况下,系统会将用户提交的计划任务放在目录/var/spool/cron中,并以用户名命名计划任务文件。root用户可以借此查看哪些用户使用了计划任务,也可以通过修改这些文件的方式修改用户的计划任务。
(3)如果需要禁用某些用户的计划任务功能,root用户可以在文件/etc/cron.deny中添加需要禁用的用户名。
在Linux系统中,系统默认安装的许多软件也使用了计划任务。但这些计划任务并不是以用户身份添加的,因此无法通过crontab命令查看。通常将这些不是以用户身份添加的计划任务称为系统计划任务。
在系统配置文件目录中,存在一些很特殊的cron目录:
[root@localhost ~]# ls -ld /etc/cron* | grep "^d" drwx------ 2 root root 4096 Jun 22 2007 /etc/cron.d drwxr-xr-x 2 root root 4096 Nov 13 00:00 /etc/cron.daily drwxr-xr-x 2 root root 4096 Jul 15 2006 /etc/cron.hourly drwxr-xr-x 2 root root 4096 Nov 12 23:53 /etc/cron.monthly drwxr-xr-x 2 root root 4096 Nov 13 00:00 /etc/cron.weekly
上面的命令输出中,显示了4个非常关键的目录:cron.daly、cron.hourly、cron.monthly、cron.weekly。系统会分别在每天、每小时、每月、每周,执行放在这4个目录中的脚本文件。
root用户可以向系统计划任务目录中添加脚本,从而实现脚本不受用户计划任务影响的功能,主要用于软件或重要的管理脚本。
【命令格式】
at [option] [time command]
【常用选项】
f:指定一个文件作为任务脚本。
m:完成任务之后给用户发送一个邮件。
l:列出计划任务列表。
d:删除指定的计划任务。
【参数说明】
at 19:00:这种方式没有指定日期,默认为当天19:00,如果写入任务时系统时间已经过了19点,系统默认为第2天的19点。
at 7pm Oct16:使用这种方式指定日期时间时,默认为当年的10月16日,如果写入任务当天已经过了10月16日,则自动清除任务。
at now +2 hour:从现在算起两小时后。
at 10:10am tomorrow:明天早上10点10分。
【用法示例】
(1)例如要添加一个计划任务,任务时间是明天早上10点10分,任务的内容是将普通文件/file/backup复制到目录/file/nfs/:
[root@localhost ~]# at 10:10am tomorrow at> cp -R /file/backup /file/nfs/ &>/dev/null at> <EOT> job 1 at 2013-12-13 10:10
在命令提示符后输入要执行任务的时间后按Enter键,提示符at>将提示用户输入要执行的命令,这时可以输入需要执行的命令和脚本。
如果有多个命令,可以在输入完成后,按Enter键继续输入。所有命令输入完成后,可以在新行中使用快捷键Ctrl+D结束输入。按下Ctrl+D组合键后,at命令将显示<EOT>退出,并提示新任务已经加入。
从上面的例子中可以看出,at与cron还有一个很大的不同点,即at支持使用现有的环境变量,而cron则不支持。
(2)如果要执行的任务是一个脚本文件,需要使用选项f指定要执行的脚本文件。
例如:添加一个5小时后执行的脚本test.sh:
[root@localhost ~]# at now +5 hour -f /home/zhu/test.sh job 2 at 2013-12-13 03:00
虽然at命令可以支持现有的环境变量,但要使用它执行一个脚本文件时,仍然应该使用脚本的绝对模式。
(3)如果需要查看使用at命令添加的任务列表,可以使用选项l:
[root@localhost ~]# at -l 1 2013-12-13 10:10 a root 2 2013-12-13 03:00 a root
也可以直接使用命令atq:
[root@localhost ~]# atq 1 2013-12-13 10:10 a root 2 2013-12-13 03:00 a root
(4)删除一个已经存在的任务时,可以使用命令atrm。
[root@localhost ~]# atq 1 2013-12-13 10:10 a root 2 2013-12-13 03:00 a root [root@localhost ~]# atrm 1 [root@localhost ~]# atq 2 2013-12-13 03:00 a root
删除任务时,也可以使用at命令的选项d。
(5)同cron一样,at命令也将执行的任务和环境变量放入脚本文件,并将其放置在目录/var/spool/at/中。
[root@localhost ~]# ls /var/spool/at/ a000020160b354 spool
(6)如果要禁止某个用户使用at添加计划任务,可以在文件/etc/at.deny中添加该用户的用户名。
注意:无论是使用cron添加计划任务,还是使用at添加计划任务,都应该对使用命令和脚本输出做妥善处理。可以采取的方法有使用mail命令,以邮件的形式将命令输出邮寄给用户,还可以使用重定向方法将输出重定向到一个文件。