计划任务命令crontab、at

一、为计划任务提供支持

开始为系统建立计划任务之前,需要为系统添加相关设置,以确保计划任务能够正确运行。计划任务需要的支持主要包括两个方面:正确运行系统服务、准确的系统时间。

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计划任务格式

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

【命令格式】

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执行一次性计划任务

【命令格式】

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命令,以邮件的形式将命令输出邮寄给用户,还可以使用重定向方法将输出重定向到一个文件。

原文地址:https://www.cnblogs.com/nufangrensheng/p/3472120.html