代码改变世界

linux crontab 计划任务 atd和windows下的计划任务

2014-03-06 11:39  youxin  阅读(1599)  评论(0编辑  收藏  举报

crontab 命令

如果发现您的系统里没有这个命令,请安装下面两个软件包.

vixie-cron

crontabs

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。 

常用参数:

crontab   -l   //查看当前用户下的cron任务

crontab -e  //编辑当前用户的定时任务

其实就是编辑/var/spool/cron下面的用户文件,比如用户名为ad,就有个ad文件。

 

crontab -u  linuxso  -e  //编辑用户linuxso的定时任务

具体用法和格式:

 

基本格式 :
*  *  *  *  *  command
分 时 日 月 周 命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache

 

名称 : crontab

使用权限 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的文件替代目前的crontab。

crontab-[-u user]-用标准输入替代目前的crontab.

crontab-1[user]-列出用户目前的crontab.

crontab-e[user]-编辑用户目前的crontab.

crontab-d[user]-删除用户目前的crontab.

crontab-c dir- 指定crontab的目录。

crontab文件的格式:M H D m d cmd.

 

M: 分钟(0-59)。

H:小时(0-23)。

D:天(1-31)。

m: 月(1-12)。

d: 一星期内的天(0~6,0为星期天)。

cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量

说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定

user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设

定自己的时程表。

参数 :

crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数

来指定使用那个文字编辑器(比如说 setenv VISUAL joe)

crontab -r : 删除目前的时程表

crontab -l : 列出目前的时程表

crontab file [-u user]-用指定的文件替代目前的crontab。

时程表的格式如下 :

f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执

行的程序。

f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推

当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推

当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推

当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

例子 :  资料整理 www.linuxso.com   Linux安全网

 

● 0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache

● 50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务

● 50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务

● 0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘

● 1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件

● 00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} /;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
● 30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令

#每天早上7点执行一次 /bin/ls :

0 7 * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name :

0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"

20 0-23/2 * * * echo "haha"

注意 :

当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之

后加上 > /dev/null 2>&1 即可

 

例子2 :

#每天早上6点10分

10 6 * * * date

#每两个小时

0 */2 * * * date

#晚上11点到早上8点之间每两个小时,早上8点

0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * mon-wed date

#1月份日早上4点

0 4 1 jan * date

范例

$crontab -l 列出用户目前的crontab.

http://www.linuxso.com/command/crontab.html

 1、循环执行的计划任务
 linux下面有atdcrond两种计划任务,其中,atd服务使用的at命令只能执行一次,而crond服务使用的crontab定义的命令,是循环作用的,所以crond才符合我们的要求。
 crontab支持两种状态:一、直接编写计划任务;二、使用目录的方式,放在目录里面的都会定时执行。

2、可以使用的用户
 默认情况下,系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过下面两个文件限制权限:

引用
◆/etc/cron.allow:
将可以使用 crontab 的账号写入其中,若不在这个档案内的使用者则不能使用 crontab;
◆/etc/cron.deny:
将不可以使用 crontab 的账号写入其中,若未记录到这个档案当中的使用者,就可以使用 crontab 。


※类似TCPWrapper定义的方式。

3、直接使用crontab编辑计划任务:
命令:
crontab [-u username] [-l|-e|-r]
参数:


-u  :通过-u帮其它使用者建立/移除 crontab;
-e  :编辑 crontab 的内容
-l  :查看 crontab 的内容
-r  :移除 crontab 的所有内容(是全部的内容,如果只是删除某个,用-e编辑即可)


内容格式:

* *  *  *  * 命令
前面的五个*号,表示分、时、日、月、周,如:
代表意义 分钟 小时 日期 月份 周 
数字范围 0-59 0-23 1-31 1-12 0-7
*号代表任何时间都接受的意思,任意。
*号之间用空格分开,如果是一段范围,用-号连接;如果是隔开几个时间,用,号表示。
另外,命令必须是编写计划任务的用户有权限执行的,并且最后用绝对路径。

cron表达式详解:

http://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html

http://blog.csdn.net/tiwen818/article/details/6988105

http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

http://blog.csdn.net/hailongge/article/details/4931930
例如:

#crontab -e
59 23 1 5 * mail linuxing < /home/test.txt
每在5月1日,23点59分就把/home/test.txt的内容作为邮件发给linuxing用户
*/5 * * * * /opt/test.sh
每5分钟就执行一次/opt/test.sh脚本
0 3,6 * * * /usr/local/bin/test.sh
每在3点和6点整点都执行/usr/local/bin/test.sh命令
0 8-12 * * * /root/backup.sh
8 点到 12 点之间的每小时的0分都执行/root/backup.sh



4、基于目录的方式执行计划任务
 对于系统的计划任务,已经在/etc/crontab里面定义,采用的就是基于目录的方式。系统会定时读取该文件,并根据里面的定义执行命令。
 可以使用vi直接编写/etc/crontab文件,其中格式如下:

#cat /etc/crontab
SHELL=/bin/bash  #使用的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin  #预定义的PATH路径
MAILTO=root   #出现问题发Email给该用户
HOME=/  #家目录

# run-parts
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   #每个月1号
分 时 日 月 周 执行者身份  命令



 可以看到前面的五个参数的定义和直接编辑计划任务是一样的,增加了执行的用户定义和run-parts参数。
 run-parts后面跟的是目录名称,例如:/etc/cron.hourly,表示每小时01分就到/etc/cron.hourly目录中执行目录下的所有可执行文件;当然,目录是可以自己定义的。
 如果你需要增加系统的计划任务,只需要在对应的目录添加执行文件即可,例如:我需要在每天都执行updatedb的操作,则我只需要把/usr/bin/updatedb的执行命令链接到/etc/cron.daily目录就可以了。

※同样的,如果不需要使用目录的方式,也可以使用如下的方式:

02 01 * * *   root     /root/test.sh
也就是没有了run-parts,后面就直接跟命令的绝对路径



5、注意事项
如果使用crontab编辑计划任务或直接修改/etc/crontab文件后,计划任务没有生效,可能需要重启一下crond服务:service crond restart
◆当编写/etc/crontab文件的时候,不要漏了指定执行计划任务的用户,这是和直接用crontab -e编辑不同的。
◆某用户(如root)用crontab -e编辑的计划任务存放在/var/spool/cron/root,这个文件下。但最好不要直接编辑他,因为crond执行的时候,会在/tmp目录中建立需要的临时文件,直接编辑会对此有影响,甚至出错。
◆cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。

 

   atd服务

如果你的计划任务只要执行一次,那么就请你使atd服务。在默认情况下,Linux系统是开启了atd这个服务的。如果不确认你的Linux是否开启了atd服务,请使用下面这个命令查看:

      # /etc/init.d/atd status

      atd (pid  3016) 正在运行...

从上面可以看出atd服务是启动的。如果你的atd服务没有启动可以使用

      # /etc/init.d/atd start

来启动你的atd服务。

atd服务中我们经常要使用到的是at命令与at命令相关的有/etc/at.deny /etc/at.allow两个文件用来过滤哪些用户可以使用at命令。Linux 预设情况下,只有/etc/at.deny 这个文件,且这个文件内容为空,由于内容没有任何使用者,所以所有人都可以使用at命令。如果不想要某个使用者使用at时,那么将该使用者登录用户名写到/etc/at.deny 这个文件中即可。

Linux系统中还可以自行创建/etc/at.allow文件,使得写在这个文件中的使用者才能使用at,没有在这个文件中的使用者则不能使用at ( 即使没有写在at.deny 当中)。如果这两个文件都不存在,那么只有root可以使用at命令。

      下面来看一下如何使用at命令:

       at [-m]  TIME     //下达计划任务,之后会出现编辑窗口,写入要执行的命令

      -m :执行 at 计划任务时,将屏幕输出结果mail给下达指令的使用者。

      TIME的格式具体请参照我下面的列子吧。

      # at 04:00 2011-09-20  //2011920号上午四点执行命令。

      # at 11pm                    //今天晚上11点执行,如果已经过了,等到明天晚上

      # at 08am + 3 weeks  //三周后的上午八点执行

      此外还有两个常用命令:

       atq         ;     //查看计划任务

       atrm        ;     //删除计划任务

实例:

[root@localhost ~]#at 13:08 2014-03-27

at> date >/root/2013.log         

at> <EOT> (按ctrl+d结束)

job 7 at 2014-03-27 13:08

[root@localhost ~]#

 

windows下没有crontab这个命令,参考http://stackoverflow.com/questions/707184/how-do-you-run-a-crontab-in-cygwin-on-windows

windows下有2个计划任务命令:

 at 和schtasks。

http://technet.microsoft.com/zh-cn/library/cc738335(v=ws.10).aspx

计划任务每 20 分钟运行一次

下面的命令计划安全脚本 Sec.vbs 每 20 分钟运行一次。该命令使用 /sc 参数指定分钟计划,使用 /mo 参数指定时间间隔为 20 分钟

由于该命令没有包含开始日期或时间,因此任务在命令完成 20 分钟后启动,此后在系统运行时每 20 分钟运行一次。请注意,安全脚本源文件位于远程计算机上,但任务在本地计算机上计划并执行。

schtasks /create /sc minute /mo 20 /tn "Security Script" /tr \\central\data\scripts\sec.vbs

/tn为task name任务名称,每个任务名称必须唯一。

 

每个一分钟启动notepad:

schtasks /create /sc minute /mo 1 /tn "Security Script" /tr  C:\Windows\System32\notepad.exe

参考微软官方:http://technet.microsoft.com/zh-cn/library/cc772785(v=ws.10).aspx#BKMK_create

更多:

http://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800

 

进入vi编辑模式,写入如下:
*/60 * * * * top -b -n1|head -10 >> /usr/moniterlog 2>&1
(每个小时将top10 追加到文件中)
 


系统的job就放在 /etc/crontab 下,一般不会去编辑它...,一般用户也可以用命令 crontab -e 可以在 /var/spool/cron/username里创建一个crontab文件哦,

crontab -u 用户名 -l      (用root用户执行以这条命令就可以了,想看谁的看谁的)
root查看自己的crontab设置:crontab l    crontab u root l    # -u 参数默认可缺省执行后输出结果相同

crontab –e

/1 * * * *

echo "Hello world."

wq

"/tmp/crontab.XXXXqrVcET" 2L, 32C written

crontab: installing new crontab

"/tmp/crontab.XXXXqrVcET":1: bad minute

errors in crontab file, can't install.

Do you want to retry the same edit?

Enter Y or N

 

这样就无法保存crontab任务,更就无法执行crontab指令,不断的提示你重新修改,说明你crontab命令格式错误。

每两个小时 0 */2 * * *

晚上11点到早上8点之间每两个小时,早上八点 0 23-7/28 * * *

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11 0 11 4 * 1-3

11早上4 0 4 1 1 *

编辑完某个用户的crontab计划任务后,crontab自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的crontab信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。crontab启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

 

5、编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash

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

MAILTO=root      #如果有数据输出不管正确还是错误,数据都会作为邮件发给这个帐号默认为root

HOME=/    #执行者使用crontab的路径,默认是/ 目录

 

# run-parts

 

01 * * * * root run-parts /etc/cron.hourly #每小时执行/etc/cron.hourly内的脚本

02 4 * * * root run-parts /etc/cron.daily #每天执行/etc/cron.daily内的脚本

22 4 * * 0 root run-parts /etc/cron.weekly #每星期执行/etc/cron.weekly内的脚本

42 4 1 * * root run-parts /etc/cron.monthly #每月去执行/etc/cron.monthly内的脚本

#注意:这个配置文件,网上有帖子说这个文件可以直接使用crontab命令格式来写入所需执行内容的,但我经过测试后发现无法实现,crontab l无法查到计划任务,但配置文件确实被修改了,重启服务后也不生效,还有篇帖子说"run-parts"这个参数如果去掉,然后输入自己需要执行的shell脚本就可以执行了,我修改过执行时间,备份好该文件后,删除原文件的“run-parts”参数,然后加上自己的shell脚本路径,发现并么生效,重新加载服务后也一样,这一点也是通过测试得出的结论,所以,只有用crontab e 用来修改更新/var/spool/cron文件才能直观的现计划任务;

 crontab文件位置:

Linux在相应用户下,用crontab -l 命令可以查看该用户定时执行的任务,-e可以编辑,但是其真实文件在哪儿呢??
以CentOS为例,其真实的位置在:/var/spool/cron下面,有执行定时任务的用户将会有以该用户命名的一个文档,vim该文档与用命令crontab -l看到的一样。

crontab命令

crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。

在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设 有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的 时间。

然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:

cr
ontab test.cron

这样一个crontab 文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab 文件。用more命令查看该文件的内容可以发现文件头有三行信息:

#DO NOT EDIT THIS FILE -edit the master and reinstall.

#(test.cron installed on Mon Feb 22 14:20:20 1999)

#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)

大概意思是:

#切勿编辑此文件——如果需要改变请编辑源文件然后重新安装。

#test.cron文件安装时间:14:20:20 02/22/1999

如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用crontab命令安装。

可以使用crontab命令的用户是有限制的。如果/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;如果该文件不存 在但cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只 允许超级用户使用该命令,也可能是所有用户都可以使用该命令。

crontab命令的语法格式如下:

crontab [-u user] file

crontab [-u user]{-l|-r|-e}

第一种格式用于安装一个新的crontab 文件,安装 淳褪莊ile所指的文件,如果使用“-”符号作为文件名,那就意味着使用标准输入作为安装来源。

-u 如果使用该选项,也就是指定了是哪个具体用户的crontab 文件将被修改。如果不指定该选项,crontab 将默认是操作者本人的crontab ,也就是执行该crontab 命令的用户的crontab 文件将被修改。但是请注意,如果使用了su命令再使用crontab 命令很可能就会出现混乱的情况。所以如果是使用了su命令,最好使用-u选项来指定究竟是哪个用户的crontab文件。

-l 在标准输出上显示当前的crontab。

-r 删除当前的crontab文件。

-e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。

 

 

 

6.Crontab的两个关键的权限控制文件

crontab指令默认所有用户都可以执行,为了降低对服务器的负载和资源有效利用,我们有必要禁止普通用户实用该命令批量或定时执行任务计划;那么,一定关系到以下两个文件

/etc/cron.deny                 /etc/cron.allow

cron.deny文件是该服务默认生成的,用于控制用户权限,只要用户写入某普通用户的用户名,那么该用户将无法使用crontab命令来执行任务计划

cron.allow 文件是需要管理员手工创建的,该文件的作用是只有该文件里写入的用户才可以执行crontab,这个类似于我们的iptables规则,先默认全部deny,然后再放允许权限,这样可以有效的规范网络内部安全。cron.allow文件也为cron服务普通用户登陆限制的控制文件,不同cron.deny的是当crontab指令查询到cron.allow文件存在时,就不再匹配cron.deny文件了,当cron.allow为空时默认所有普通用户无法使用crontab指令执行任务计划

crontab深入

Linux cron运行原理

http://my.oschina.net/daquan/blog/483305

 

一种奇怪的现象

crontab执行某些进程启动不了,但是手动启动脚本可以?

什么原因?

 

最后找到了,执行命令需要从path查找依赖的lib和so。

我用root身份默认载入了/etc/profile,但是crontab没有。我手动在脚本前面加上:


. /etc/profile