一、为计划任务提供支持

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

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

计划任务命令crontab、at的更多相关文章

  1. 建立Linux计划命令crontab

    crontab翻译:排程,命令 crontab从输入设备输入命令,并将其放入crontab文件,供守护进程crond读取并执行,crond在后台每一分钟执行一次 crontab -e:创建计划命令,进 ...

  2. linux命令:crontab命令(转)

    一.crond简介 二.crond服务 三.crontab命令详解 四.使用注意事项 linux系统是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作 ...

  3. Debian的定时执行命令Crontab

    转载:http://i.592.net/?post=276 Debian的定时执行命令Crontab,这个相当于Windows的计划任务 想要让Debian定时执行命令就得靠crontab了!     ...

  4. Linux下计划任务以及crontab权限问题

    在Linux工作环境下,我们有时可能会需要在未来某个时间执行某个命令或脚本,但是我们又不可能定个闹钟,然后到点了再去执行吧,这多麻烦.还好我们的Linux系统这么强大,提供了任务计划这个功能,我们就不 ...

  5. linux学习(六)计划任务命令

    目录 at命令 @(计划任务命令) at命令 at命令用于指定在未来某一时间执行一个任务,该任务只能被执行一次 at [选项] [时间] f:指定包含具体指令的任务文件 q:指定新任务队列名称 l:显 ...

  6. 计划任务之一次性计划任务(at)和周期性计划任务(crontab)(重点)

    一:知识要点 ----计划任务的意义----计划任务分类----用户计划任务crontab----系统计划任务----计划任务使用注意事项----anacron服务介绍 二:计划任务的意义计划任务 - ...

  7. Win7计划任务命令

    计划任务命令 schtasks C:\Users\Administrator>schtasks /? SCHTASKS /parameter [arguments] 描述: 允许管理员创建.删除 ...

  8. Linux任务计划命令 :crontab -e

    crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond ...

  9. linux命令crontab

    1.需求 服务端计划任务执行 2.例子 使用crontab命令 参考:http://justjavac.com/other/2013/09/22/linux-scheduled-task-cronta ...

随机推荐

  1. ios开发APP必须要了解的基本配置

    1,配置开发版本 AdHoc开发版,AppStore正式版 2,oc的宏转swift //常量=>ObjectC宏 letLoadingTip="加载中..." letiOS ...

  2. extjs 学习笔记(二)

    EXTJS实用开发指南 1. 要使用ExtJS 框架的页面中一般包括下面几句: <link rel="stylesheet" type="text/css" ...

  3. rm 注意

    软连接ln -s lnfile file rm -rf lnfile只是删除lnfile ln -s lndir dir rm -rf lndir 删除链接 rm -rf lndir/删除目录下文件

  4. SharePoint咨询师之路:设计之前的那些事四:负载均衡 - web服务器

     提示:本系列只是一个学习笔记系列,大部分内容都可以从微软官方网站找到,本人只是按照自己的学习路径来学习和呈现这些知识.有些内容是自己的经验和积累,如果有不当之处,请指正. 容量管理 规模 体系结构 ...

  5. 安装完 MySQL 后必须调整的 10 项配置(转)

    英文原文:10 MySQL settings to tune after installation 译文原文:安装完 MySQL 后必须调整的 10 项配置 当我们被人雇来监测MySQL性能时,人们希 ...

  6. C++11for循环

    [C++11for循环] for 述句将允许简单的范围迭代,引用或非引用形式均可: 参考:http://zh.wikipedia.org/wiki/C++0x

  7. [iOS微博项目 - 2.4] - 重新安排app启动步骤

    github: https://github.com/hellovoidworld/HVWWeibo   A.app启动步骤 1.加入了授权步骤之后,最先要判断app内是否已经登陆了账号 2.在程序启 ...

  8. Android - 应用名称设置的问题

    今天我想修改我的android应用名称,就是手机桌面上图标下面的名称,根据我的理解我修改AndroidManifest.xml文件中application标签中的android:label=" ...

  9. Android 通过ViewFlipper实现广告轮播功能并可以通过手势滑动进行广告切换

    为了实现广告轮播功能,在网上找了很多方法,有的效果很好,但是代码太麻烦,并且大多是用的viewpager,总之不是很满意. 于是看了一下sdk有个控件是ViewFlipper,使用比较方便,于是尝试了 ...

  10. hdoj 5400 Arithmetic Sequence

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5400 水题 #include<stdio.h> typedef long long LL; ...